WinForm枚举容器中的控件,实现控件统一事件处理机制

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 我们知道,要在应用程序中使用事件,必须提供一个事件处理程序(事件处理方法),这通常用委托来实现。但当想对某个容器中的同类控件的相同事件都实现相同的处理方法时,可能通过枚举容器中的控件并指定相关委托来实现事件的处理。

 

我们知道,要在应用程序中使用事件,必须提供一个事件处理程序(事件处理方法),这通常用委托来实现。但当想对某个容器中的同类控件的相同事件都实现相同的处理方法时,可能通过枚举容器中的控件并指定相关委托来实现事件的处理。或许你会说,干吗要说得这么复杂,我可以在控件的属性中指定事件处理方法来实现,但当容器中的控件很多,或者在设计过程中加入了新的控件,逐个指定毕竟是很麻烦的一件事。
    如下图所示,在应用中有两个文本框,我想指定两个文本框(用户名与密码)的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); 
        } 

 

目录
相关文章
|
9月前
|
XML Java 数据格式
编织Spring魔法:解读核心容器中的Beans机制【beans 一】
编织Spring魔法:解读核心容器中的Beans机制【beans 一】
124 0
|
9月前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
83 0
|
6月前
|
容器
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Group Box的使用及说明
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Group Box的使用及说明
523 3
|
6月前
|
容器
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Tab Widget的使用及说明
【Qt 学习笔记】Qt常用控件 | 容器类控件 | Tab Widget的使用及说明
557 2
|
6月前
|
Kubernetes 网络协议 Linux
容器跨主机通信:Flannel网络实现机制分析(二)
容器跨主机通信:Flannel网络实现机制分析(二)
155 0
|
6月前
|
存储 Linux 数据中心
容器跨主机通信:Flannel网络实现机制分析(一)
容器跨主机通信:Flannel网络实现机制分析(一)
284 0
|
9月前
|
存储 安全 数据中心
【Docker 专栏】Docker 容器与宿主机的资源隔离机制
【5月更文挑战第8天】Docker容器利用Namespace和Cgroups实现资源隔离,保证CPU、内存、网络和存储的独立,提升资源利用率和系统安全性。资源隔离有助于简化应用部署与管理,但也带来资源竞争、监控管理及安全挑战。理解并善用资源隔离机制能实现更高效、安全的容器运行。随着技术进步,Docker容器资源隔离将持续优化。
670 2
【Docker 专栏】Docker 容器与宿主机的资源隔离机制
|
9月前
|
容器 内存技术
Qt中常用容器组控件介绍和实操-1
Qt中常用容器组控件介绍和实操
|
9月前
|
API 容器
Qt中常用容器组控件介绍和实操-2
Qt中常用容器组控件介绍和实操
|
9月前
|
编译器 程序员 C++
【C/C++ 容器操作】C++高效编程:掌握emplace_back与push_back的使用和机制
【C/C++ 容器操作】C++高效编程:掌握emplace_back与push_back的使用和机制
248 0