C#父窗体监听子窗体事件或在父窗体中处理子窗体控件的事件
前言
在C#程序编写过程中,我们可能会遇到子窗体点了一下按钮,或者勾选了个复选框
想让其在父窗体中处理这个事件的问题。
虽然可以通过直接将子窗体的控件变为公有属性,这样就可以直接在父窗体中绑定上这个事件。但是!!!
如果业务变得复杂,这种问题变多了,会让我们的代码耦合度非常高,可读性也会变得很差。
使用默认事件委托
子窗体代码演示
在这种情况下,我们便可以通过事件委托将这个事件抛出来达到这个目的。
下面上代码演示:
private CheckBox[] checkboxes;//我这里有若干个控件,我希望不管勾选哪个控件父窗体都能捕获到这个事件
public event EventHandler CANCheckedChanged;//用于抛出某个CANID选中状态改变的事件,用于父类调用
public SelectBox()
{
InitializeComponent();
checkboxes = new CheckBox[10];//这里把控件数组初始化,现在只是数组初始化完成,数组里面的对象还是空的哦
for (int i = 0; i < checkboxes.Length; i++)
{
checkboxes[i] = new CheckBox();
checkboxes[i].CheckedChanged += new EventHandler(checkBoxChild_CheckedChanged);//这里将事件绑定到子窗体中的一个函数上,再通过这个函数将事件抛出给父窗体
}
}
//当某个CANID选中状态改变时抛出该事件
//这个函数用来接收这若干个CheckBox的事件,所以参数需要和系统委托保持一致
private void checkBoxChild_CheckedChanged(object sender, EventArgs e)
{
//利用我们自己定义的委托将这个事件抛出
CANCheckedChanged.Invoke(sender, e);
}
父窗体使用方法
//初始化子窗体时将子窗体声明的事件委托绑定到一个处理函数上
Form selectBox = new Form();
selectBox.CANCheckedChanged += new EventHandler(checkBoxChild_CheckedChanged);
//这里是父窗体的处理函数,也就是上面绑定的函数
private void checkBoxChild_CheckedChanged(object sender, EventArgs e)
{
if (((CheckBox)sender).Checked)
MessageBox.Show("子窗体控件被勾选了");
else
MessageBox.Show("子窗体控件被取消勾选了");
}
使用自定义的事件委托
这里作者并没有实际测试使用过,只是突然奇思妙想,如果有误请联系作者删除
子窗体代码演示
//跟上面使用默认的事件委托差不多,只不过这次我们自己声明一个
public delegate void MyEvent(int 参数1, string 参数2, object 参数3);//如果需要自定义数据可以使用自定义的委托
public event MyEvent myEventChanged;//将上面的委托声明一个委托事件
//然后像上面一样绑定上控件的事件
//当某个CANID选中状态改变时抛出该事件
private void checkBoxChild_CheckedChanged(object sender, EventArgs e)
{
myEventChanged.Invoke(1, "2", sender);//这时候就可以抛出我们的自定义事件
}
父窗体使用方法
//初始化子窗体时将子窗体声明的事件委托绑定到一个处理函数上
Form selectBox = new Form();
selectBox.myEventChanged += new SelectBox.MyEvent(CheckedChanged);//SelectBox是子窗体的类名,这样才可以找到我们自定义的委托
//使用的时候参数与上面定义的参数保持一致就可以了
public void CheckedChanged(int 参数1, string 参数2, object 参数3)
{
//处理这个事件的代码
}