例如有下面的需求需要实现:程序主画面中弹出一个子窗口。此时主画面仍然可以接收用户的操作(子窗口是非模态的)。子窗口上进行某些操作,根据操作的结果要在主画面上显示不同的数据。
大多数我们会这样做:
表单1窗口定义:
public partial class Form1 : Form
{ public string LabelName
{
get { return this.label1.Text; }
set { this.label1.Text = value; }
} public Form1()
{
InitializeComponent();
this.button1.Click += new EventHandler(button1_Click);
} /// <summary>
/// 按钮触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
Form2 form2 = new Form2();
form2.form1 = this;
form2.Show();
}
}
表单2窗口定义:
public partial class Form2 : Form
{
public Form1 form1;
public Form2()
{
InitializeComponent();
this.button1.Click += new EventHandler(button1_Click);
} /// <summary>
/// 表单2按钮触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
form1.LabelName = "改变之后";
}
}
这样虽然可以达到目的,但是各个模块之间产生了很强的耦合。一般说来模块之间的调用应该是单方向的:模块A调用了模块B,模块B就不应该反向调用A,否则就破坏了程序的层次,加强了耦合程度,也使得功能的改变和追加变得很困难。
所以这里就用到了事件:
下边是表单2中的事件定义:
public partial class Form2 : Form
{
public delegate void OutputMessage(object sender, System.EventArgs e);
public event OutputMessage ButtonClick; public Form2()
{
InitializeComponent(); this.button1.Click += new EventHandler(button1_Click);
} /// <summary>
/// 表单2按钮触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
ButtonClick(this, e);
}
}
然后在表单1中进行捕获:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.button1.Click += new EventHandler(button1_Click);
} /// <summary>
/// 按钮触发
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void button1_Click(object sender, EventArgs e)
{
Form2 form = new Form2();
form.Show();
form.ButtonClick += new Form2.OutputMessage(form_ClickButton);
} private void form_ClickButton(object sender, EventArgs e)
{
this.label1.Text = "改变之后";
}
}
这样,各个模块专心的做自己的事情,不需要过问其他模块的事情。
不知道说的对不对,还请指教。。。