WinForm枚舉容器中的控件,實現控件統一事件處理機制


 

我們知道,要在應用程序中使用事件,必須提供一個事件處理程序(事件處理方法),這通常用委托來實現。但當想對某個容器中的同類控件的相同事件都實現相同的處理方法時,可能通過枚舉容器中的控件並指定相關委托來實現事件的處理。或許你會說,干嗎要說得這么復雜,我可以在控件的屬性中指定事件處理方法來實現,但當容器中的控件很多,或者在設計過程中加入了新的控件,逐個指定畢竟是很麻煩的一件事。
    如下圖所示,在應用中有兩個文本框,我想指定兩個文本框(用戶名與密碼)的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); 
        } 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM