zoukankan      html  css  js  c++  java
  • 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); 
            } 
  • 相关阅读:
    转:5个AJAX Loading动画图标生成器
    小练习:图片轮播jQuery版
    找不同,在一定范围内找出不同数最小的数组。
    一个Hibernate的Hello World, 基于Hibernate 4.0
    队列的操作, 计算要出队某个数需要移动的距离.
    使用反射操作私有(Private)方法和属性
    求由色子组成的立方体的5个可见面(底部不算)中所有数字最小之和.
    动态代理的简单实例.
    设计模式:Java的代理模式.
    Java的反射 基础+简单复制对象实例
  • 原文地址:https://www.cnblogs.com/51net/p/2424391.html
Copyright © 2011-2022 走看看