我們知道,要在應用程序中使用事件,必須提供一個事件處理程序(事件處理方法),這通常用委托來實現。但當想對某個容器中的同類控件的相同事件都實現相同的處理方法時,可能通過枚舉容器中的控件並指定相關委托來實現事件的處理。或許你會說,干嗎要說得這么復雜,我可以在控件的屬性中指定事件處理方法來實現,但當容器中的控件很多,或者在設計過程中加入了新的控件,逐個指定畢竟是很麻煩的一件事。
如下圖所示,在應用中有兩個文本框,我想指定兩個文本框(用戶名與密碼)的Enter、Leave與Validating事件,當文本框獲得焦點時改變其背景色,當離開時還原為系統文本顏色,並用Validating方法檢查文本框內容是否為空,為空時用ErrorProvider顯示錯誤信息。
我通過方法AddEventHandler來枚舉窗體中的控件,當它是文本框時指定事件的委托,代碼如下:
/**/ /// <summary>
/// 枚舉容器中的控件,並增加文本框的事件處理委托
/// </summary>
/// <param name="pnl"> container </param>
private void AddEventHandler(Control pnl)
{
foreach(Control ctrl in pnl.Controls)
{
if(ctrl is TextBox)
{
ctrl.Enter+= new EventHandler( this.txt_Enter);
ctrl.Leave+= new EventHandler( this.txt_Leave);
ctrl.TextChanged+= new EventHandler( this.txt_TextChanged);
ctrl.Validating+= new CancelEventHandler( this.txt_Validating);
}
if(ctrl.HasChildren)
如下圖所示,在應用中有兩個文本框,我想指定兩個文本框(用戶名與密碼)的Enter、Leave與Validating事件,當文本框獲得焦點時改變其背景色,當離開時還原為系統文本顏色,並用Validating方法檢查文本框內容是否為空,為空時用ErrorProvider顯示錯誤信息。
我通過方法AddEventHandler來枚舉窗體中的控件,當它是文本框時指定事件的委托,代碼如下:
/**/ /// <summary>
/// 枚舉容器中的控件,並增加文本框的事件處理委托
/// </summary>
/// <param name="pnl"> container </param>
private void AddEventHandler(Control pnl)
{
foreach(Control ctrl in pnl.Controls)
{
if(ctrl is TextBox)
{
ctrl.Enter+= new EventHandler( this.txt_Enter);
ctrl.Leave+= new EventHandler( this.txt_Leave);
ctrl.TextChanged+= new EventHandler( this.txt_TextChanged);
ctrl.Validating+= new CancelEventHandler( this.txt_Validating);
}
if(ctrl.HasChildren)
//遞歸注冊事件。
AddEventHandler(ctrl);
}
}
/**/ /// <summary>
/// 實現文本框的Enter事件處理方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txt_Enter( object sender,System.EventArgs e)
{
TextBox tb=(TextBox)sender;
tb.BackColor=Color.BlanchedAlmond;
}
/**/ /// <summary>
/// 實現文本框的Leave事件處理方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txt_Leave( object sender,System.EventArgs e)
{
TextBox tb=(TextBox)sender;
tb.BackColor=Color.FromKnownColor(KnownColor.Window);
}
/**/ /// <summary>
/// 實現文本框的Validating事件處理方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txt_Validating( object sender,System.ComponentModel.CancelEventArgs e)
{
TextBox tb=(TextBox)sender;
errorProvider1.SetError(tb, "");
if(tb.Text.Length== 0)
{
errorProvider1.SetError(tb, " Please input any text! ");
tb.Focus();
}
}
然后在Form1的構造函數中增加AddEventHandler( this)語句:
public Form1()
{
//
// Windows 窗體設計器支持所必需的
//
InitializeComponent();
AddEventHandler( this);
}
AddEventHandler(ctrl);
}
}
/**/ /// <summary>
/// 實現文本框的Enter事件處理方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txt_Enter( object sender,System.EventArgs e)
{
TextBox tb=(TextBox)sender;
tb.BackColor=Color.BlanchedAlmond;
}
/**/ /// <summary>
/// 實現文本框的Leave事件處理方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txt_Leave( object sender,System.EventArgs e)
{
TextBox tb=(TextBox)sender;
tb.BackColor=Color.FromKnownColor(KnownColor.Window);
}
/**/ /// <summary>
/// 實現文本框的Validating事件處理方法
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void txt_Validating( object sender,System.ComponentModel.CancelEventArgs e)
{
TextBox tb=(TextBox)sender;
errorProvider1.SetError(tb, "");
if(tb.Text.Length== 0)
{
errorProvider1.SetError(tb, " Please input any text! ");
tb.Focus();
}
}
然后在Form1的構造函數中增加AddEventHandler( this)語句:
public Form1()
{
//
// Windows 窗體設計器支持所必需的
//
InitializeComponent();
AddEventHandler( this);
}