问题由来:要实现的功能是点击Form_Settings的保存按钮或者关闭 Form_Settings的时候刷新Form_FlashStart的控件。
原来的代码
Form_FlashStart的代码如下:
public partial class Form_FlashStart : Form
{
public Form_FlashStart()
{
InitializeComponent();
Form_Settings frm_settings = new Form_Settings();
//第四步:将要实现的方法绑定到委托事件
frm_settings.MyEvent += new Form_Settings.MyDelegate(b_MyEvent);//监听b窗体事件
}
private void pictureBox_Setting_Click(object sender, EventArgs e)
{
Form_Settings frm_settings = new Form_Settings();
frm_settings.ShowDialog();
}
//第三步:实现要做的事情
void b_MyEvent(string message)
{
MessageBox.Show(message);
//这里是刷新窗体的方法
LoadTabControl_Main();
LoadImageList();
}
}
Form_Settings的代码如下:
public partial class Form_Settings : Form
{
//第一步:声明一个委托
public delegate void MyDelegate(string message);
//第二步:声明一个事件
public event MyDelegate MyEvent;
public Form_Settings()
{
InitializeComponent();
}
private void pictureBox_Close_Click(object sender, EventArgs e)
{
//第五步:触发事件
if (MyEvent != null) //确保事件在Form1中已被绑定
MyEvent("关闭窗口"); //触发事件
this.Close();
}
}
问题出现
执行代码时Form_Settings的关闭窗体事件里的
if (MyEvent != null)
MyEvent一直为null,触发不了委托事件。乍一看,没发现有什么问题,但是就是一直为null。
问题解决
经过思考发现,原来出错的原因是第四步:将要实现的方法绑定到委托事件。我们可以看到这里监听的窗体是新new出来的一个窗体。
public Form_FlashStart()
{
InitializeComponent();
Form_Settings frm_settings = new Form_Settings();
//第四步:将要实现的方法绑定到委托事件
frm_settings.MyEvent += new Form_Settings.MyDelegate(b_MyEvent);//监听b窗体事件
}
而我们实际要监听的窗体是在Form_FlashStart的pictureBox_Setting_Click事件里打开的Form_Settings窗体。
private void pictureBox_Setting_Click(object sender, EventArgs e)
{
Form_Settings frm_settings = new Form_Settings();
frm_settings.ShowDialog();
}
所以才会导致Form_Settings里的MyEvent一直为null。下面给出正确的Form_FlashStart代码的写法:
public partial class Form_FlashStart : Form
{
public Form_FlashStart()
{
InitializeComponent();
}
private void pictureBox_Setting_Click(object sender, EventArgs e)
{
Form_Settings frm_settings = new Form_Settings();
//第四步:将要实现的方法绑定到委托事件
frm_settings.MyEvent += new Form_Settings.MyDelegate(b_MyEvent);//监听b窗体事件
frm_settings.ShowDialog();
}
//第三步:实现要做的事情
void b_MyEvent(string message)
{
MessageBox.Show(message);
//这里是刷新窗体的方法
LoadTabControl_Main();
LoadImageList();
}
}
总结
其实很多问题的出现只是你的一个小疏忽导致的,但是只要静下心来梳理一下思路,一步一步调试,相信很快会发现问题所在。C#的委托之前我也用过,但是没有真正理解,完全是照搬照抄的,这个例子让我也更加深刻的理解了委托的使用。大家也可以利用这个例子学习一下怎么使用C#委托。