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); 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

光怪陆离的节日

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值