说明
- 不是在子窗口使用主窗口的控件
- 是修改控件,不是变量
- 我要实现的具体功能是在窗口单击按钮打开一个新窗口,此时该按钮失效,当关闭打开的新窗口时,激活该按钮。这样做的目的是为了避免每点击一次该按钮,就生成一个新窗口(除非确实有该需要),当然如果将该按钮的单击触发事件改为Showdialog()就不用考虑该问题,但这样就不能同时操作两个窗口(如果没有该需要可以这样做),我目前的单击触发事件为Show()
- 下面我介绍的方法不仅仅针对我的需求,如果有同样问题不同需求的读者同样可以参考
实现方法1
- 创建主窗口Form1,略
- 在主窗口添加按钮Button,修改Name属性为:newForm
- 创建新窗口,Form2 ,略
- 添加按钮newForm的单击触发事件,方法:略
代码:
private void newForm_Click(object sender, EventArgs e)
{
//将当前Form1的窗口对象以参数传到新建的Form2的对象中(通过含参构造器)
//这样Form2的对象就可以使用Form1对象中的控件了。
Form2 fm2 = new Form2(this);
fm2.Show();//我使用的是Show()不是Showdialog()
newForm.Enabled = false;//让该按钮失效
}
- 修改该按钮的属性:设计-Modifiers为public,让其在外部可访问
- 在Form2的代码中,新增一个Form1的对象,新增一个含参的构造器
代码
private Form1 fm1;
public Form2()
{
InitializeComponent();
}
public Form2(Form1 fm1)
{
InitializeComponent();
this.fm1 = fm1;
}
- 设置该窗口的关闭触发事件,这个在窗体的触发事件中可以找到,有两个,我用的是Closed
- 添加关闭窗口触发事件
private void Form2_FormClosed(object sender,FormClosedEventArgs e)
{
//激活主窗口的newForm按钮
fm1.newForm.Enabled = true;
}
- 完整代码
主窗体Form1
namespace WFATest2
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
}
private void newForm_Click(object sender, EventArgs e)
{
Form2 fm2 = new Form2(this);
fm2.Show();
newForm.Enabled = false;
}
}
}
子窗体Form2
namespace WFATest2
{
public partial class Form2 : Form
{
private Form1 fm1;
public Form2()
{
InitializeComponent();
}
public Form2(Form1 fm1)
{
InitializeComponent();
this.fm1 = fm1;
}
private void Form2_FormClosed(object sender,FormClosedEventArgs e)
{
fm1.newForm.Enabled = true;
}
}
}
启动展示
启动Form1
点击newForm,生成Form2
可以看到newForm的按钮已变灰,同时,我可以同时对这两个窗口操作,不受影响
关闭Form2
newForm按钮已激活
实现方法2
在创建新窗口的方法中就注册一个新窗口关闭时的事件
private void newForm_Click(object sender, EventArgs e)
{
Form2 fm2 = new Form2(this);
fm2.Show();
newForm.Enabled = false;
fm2.Closed += Fm2_Closed;
}
private void Fm2_Closed(object sender, EventArgs e)
{
newForm.Enabled = true;
}