C# 中的事件是当对象满足一定条件发生某些事情时类向该类的客户提供通知的一种方法使用事件拥有该事件的对象不必知道需要通知谁一旦满足了某个条件将自动调用该事件正确通知每个需要通知的对象通过使用事件提高了程序的模块化程度
要在程序中使用自定义事件需按以下步骤进行
声明事件
要在类内声明事件首先必须声明该事件的委托类型
public delegate void SelectionChangedEventHandler(object sender
SelectionChangedEventArgs e);
说明由于本示例程序需在事件中传递数据因此定义了EventArgs的派生类SelectionChangedEventArgs
public class SelectionChangedEventArgs : EventArgs
{
private string m_selection;
//本属性用于传递事件数据
public string Selection
{
get { return m_selection; }
}
public SelectionChangedEventArgs(string selection)
{
m_selection = selection;
}
}
委托类型定义传递给处理该事件的方法的一组参数多个事件可共享相同的委托类型因此仅当尚未声明任何合适的委托类型时才需要执行该步骤
接下来声明事件本身
public event SelectionChangedEventHandler SelectionChanged;
调用事件
如果没有任何客户将委托与该事件挂钩该字段将为空否则该字段引用应在调用该事件时调用的委托因此调用事件时通常先检查是否为空然后再调用事件
public class Form : SystemWindowsFormsForm
{
public event SelectionChangedEventHandler SelectionChanged;
private void comboBox_SelectedIndexChanged(object sender SystemEventArgs e)
{
if (SelectionChanged != null)
{
SelectionChangedEventArgs E = new SelectionChangedEventArgs(comboBoxText);
SelectionChanged(this E);
}
}
}
与事件挂钩
为了开始接收事件调用客户代码先创建事件类型的委托该委托引用应从事件调用的方法然后它使用 += 将该委托写到事件可能连接到的其他任何委托上
public class Form : SystemWindowsFormsForm
{
private Form m_frm;
public Form()
{
m_frm = new Form();
//与事件挂钩
m_frmSelectionChanged += new SelectionChangedEventHandler(frm_SelectionChanged);
}
private void button_Click(object sender SystemEventArgs e)
{
m_frmShowDialog();
}
private void frm_SelectionChanged(object sender SelectionChangedEventArgs e)
{
//获取事件传递过来的数据
textBoxText = eSelection;
}
}
本示例效果如下图所示