同一命名空间下在自定义类中操作Form控件无效

antique_star 2017-04-05 08:24:38

嘿嘿!不好意思,我又来求助了。


先上图,才能知道问题概况:



问题描述:
在同一命名空间下,同一个Form1.cs
namespace 客房管理软件
{
public partial class Form1 : Form //Form1的代码
{
public Form1()//窗体加载信息
{
InitializeComponent();
TabCtlSystemSet.SelectedIndex = 1;
//此处运行无误,说明这种写法没有问题。



public partial class SubMenuBt : Button //自定义子菜单类SubMenuBt的代码
}
上两个类Form1和SubMenuBt都同位于同一命名空间“客房管理软件”下。

现在要实现菜单点击后对应的tabcontrol控件TabCtlSystemSet中的同名标签页激活为当前页,
有一种最笨的办法,就是在Form1中的每一个二级菜单控件SubMenuBt都加一个Click事件,
但是子菜单有点多,会让代码区太复杂。
所以我就想难道不可以直接在自定义控件类中的点击事件里直接写死么?反正我的这个菜单只是针对系统配置里的tabcontrol控件TabCtlSystemSet专用的。其他地方不用,所以我开始这么干啦!运行结果是不报错,也不起效果。


实在找不出原因,就请大家帮忙哪里出了问题?或者有其他更好的解决办法。


为了能在自定义SubMenuBt中引用Form1中的tabcontrol控件TabCtlSystemSet,我将它的Modifiers设为了Public。下面上代码:


public partial class SubMenuBt : Button
{
public SubMenuBt()
{
this.FlatStyle = FlatStyle.Flat;
this.FlatAppearance.BorderSize = 0;
this.Font = new Font("方正书宋简体", 10F);
this.Image = Image.FromFile(@"E:\C#开发资料\C#项目文件\控件测试图片\动态菜单图片\二级菜单图标2.png");
this.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
this.BackgroundImageLayout = ImageLayout.Stretch;
this.BackgroundImage = Image.FromFile(@"E:\C#开发资料\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Normal.png");
this.Size = new Size(150, 25);
this.Margin = new Padding(0, 1, 0, 0);
this.Checked = false;
this.MouseEnter += new EventHandler(SubMenuBt_MouseEnter);
this.MouseLeave += new EventHandler(SubMenuBt_MouseLeave);
this.Click += new EventHandler(SubMenuBt_Click);
}

public bool Checked { get; set; }

private void SubMenuBt_Click(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
sbt.BackgroundImage = Image.FromFile(@"E:\C#开发资料\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Down.png");
sbt.Checked = true;

//显示对应的标签页
Form1 fm = new Form1();
for (int i = 0; i < fm.TabCtlSystemSet.TabPages.Count; i++)
{
if (fm.TabCtlSystemSet.TabPages[i].Text == sbt.Text)
{
fm.TabCtlSystemSet.SelectedIndex = i;//此句压根没效果
break;
}
}


foreach (Control c in sbt.Parent.Controls) //恢复上一个点击按钮的状态
{
if (c is SubMenuBt)
{
SubMenuBt bt = c as SubMenuBt;
if (bt.Checked == true && bt != sbt)
{
bt.Checked = false;
bt.BackgroundImage = Image.FromFile(@"E:\C#开发资料\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Normal.png");
break;
}
}
}
}

private void SubMenuBt_MouseEnter(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
if (sbt.Checked == false)
{
sbt.BackgroundImage = Image.FromFile(@"E:\C#开发资料\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景In.png");
}
}

private void SubMenuBt_MouseLeave(object sender, EventArgs e)
{
SubMenuBt sbt = sender as SubMenuBt;
if (sbt.Checked == false)
{
sbt.BackgroundImage = Image.FromFile(@"E:\C#开发资料\C#项目文件\控件测试图片\动态菜单图片\二级菜单背景Normal.png");
}
}
}

下面是调试过程中的变量抓取,执行逻辑没有问题,我选哪个子菜单,循环也到了指定的标签页不动了,索引值也正确:

...全文
143 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
antique_star 2017-04-07
  • 打赏
  • 举报
回复
谢谢大家了!下载了个入门第2版,抽空温温基础吧。
Poopaye 2017-04-05
  • 打赏
  • 举报
回复
引用 4 楼 antique_star 的回复:
[quote=引用 1 楼 shingoscar 的回复:] [quote=引用 楼主 antique_star 的回复:] Form1 fm = new Form1();
这……楼主要不再回去培训一轮?[/quote] 我从来就没上过培训![/quote] 找本C#的入门书(不是WinForm的)看看吧,这属于很基础的知识了
xuggzu 2017-04-05
  • 打赏
  • 举报
回复
比如: 建个私有类全局变量: private Form1 _fm=null; public SubMenuBt()改为 public SubMenuBt(Form1 fm) {...... this._fm=fm; } ..... _fm.TabCtlSystemSets.selectindex=.....;
antique_star 2017-04-05
  • 打赏
  • 举报
回复
引用 1 楼 shingoscar 的回复:
[quote=引用 楼主 antique_star 的回复:] Form1 fm = new Form1();
这……楼主要不再回去培训一轮?[/quote] 我从来就没上过培训!
antique_star 2017-04-05
  • 打赏
  • 举报
回复
引用 2 楼 xuggzu 的回复:
2.Form1 fm = new Form1();这句你想干嘛?难道你的form1还没显示出来?如果已经显示了,你把Form1的实例传给你的自定义控件呗,new一个那就不是原来的窗体了。
怎么传啊?我基础实在太差了。 我只在网上看过窗体间传值,把一个窗体自己传给另一个窗体,作为对象放在另一窗体的括号中。 这里传给自定义类,就说在private void SubMenuBt_Click(object sender, EventArgs e)这个事件中如何写?
xuggzu 2017-04-05
  • 打赏
  • 举报
回复
楼主问题好长,没仔细看: 1.想Click事件都用同一处理函数,用委托就得了; 2.Form1 fm = new Form1();这句你想干嘛?难道你的form1还没显示出来?如果已经显示了,你把Form1的实例传给你的自定义控件呗,new一个那就不是原来的窗体了。
Poopaye 2017-04-05
  • 打赏
  • 举报
回复
引用 楼主 antique_star 的回复:
Form1 fm = new Form1();
这……楼主要不再回去培训一轮?

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧