有时多个窗体功能相同,控件繁多,重新布局费时费力,因此可以利用窗体继承来实现相似功能的窗体。但是在继承窗体后,我们会发现触发继承窗体上的控件时,被继承窗体的相应的控件也会被触发一次。这是因为继承窗体总是会执行被继承窗体的虚方法。
比如form2继承自form1,form1中有一个button,那么相应的form2中也会有一个button,如果我们仅是触发form2中button的click事件的话,form1的button的click也会被触发。
看下面这个例子
private void button1_Click(object sender, EventArgs e)
{
//这是form1中的click事件
MessageBox.Show("这是form1");
}
private void button1_Click(object sender, EventArgs e)
{
//这是form2中的click事件,该button继承自form1中的button
MessageBox.Show("这是form2");
}
如果我们点击form2的button的话,程序将会先显示 “这是form1” 对话框,然后再显示 “这是form2” 对话框。可以看到,被继承窗体相应事件也被触发了。
那么如何解决呢?其实很简单,只需要重写继承窗体的click事件即可。
form1中代码如下
//将按钮方法改为public virtual类型,以便继承的窗体能够重写button_Click事件
public virtual void button1_Click(object sender, EventArgs e)
{
//这是form1中的click事件
MessageBox.Show("这是form1");
}
form2中代码如下
//重写被继承按钮的button_Click事件,并在Form2.Designer.cs中注释掉被继承按钮的事件
public override void button1_Click(object sender, EventArgs e)
{
//这是form2中的click事件
MessageBox.Show("这是form2");
}
注意一定要把Form2.Designer.cs中的click事件注释掉,否则将会执行两遍 “这是form2” 对话框。
此时点击form2中的button,将只会显示 “这是form2” 对话框了。成功解决!