天天看點

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事件處理方法 

        /// <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; 

        /// 實作文本框的Leave事件處理方法 

        private void txt_Leave(object sender,System.EventArgs e) 

            tb.BackColor=Color.FromKnownColor(KnownColor.Window); 

        /// 實作文本框的Validating事件處理方法 

        private void txt_Validating(object sender,System.ComponentModel.CancelEventArgs e) 

            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); 

繼續閱讀