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

 

时间: 2024-09-28 07:32:21

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

在控件容器中,单击自己做的控件,该控件只能获得焦点,不能被选中,为什么?

问题描述 在控件容器中,插入自己做的一个控件,再插入MicrosoftForms2.0TextBox,先单击MicrosoftForms2.0TextBox,MicrosoftForms2.0TextBox获得焦点和选中状态,再单击自己做的控件,却只能获得焦点,不能被选中,为什么? 解决方案 解决方案二:怎么加图片????????????????????????????????????/解决方案三:选中是控件边框有8个黑方块,有焦点是边框有短的斜线.不知道我描述的是否清楚.解决方案四:控件容器?

WinForm的窗体中怎么在DataGrid中放入ComboBox控件(50分)

问题描述 WinForm的窗体中怎么在DataGrid中放入ComboBox控件我的代码:DataGridTextBoxColumndgtb=(DataGridTextBoxColumn)DBG.TableStyles[0].GridColumnStyles[0];ComboBoxcbmDBG=newComboBox();cbmDBG.Items.AddRange(newobject[]{"选项一","选项二","选项三","选项四&q

如何在winform中动态添加或删除控件

问题描述 如何在winform中动态添加或删除控件,多谢了 解决方案 解决方案二:本帖最后由 caozhy 于 2012-05-24 22:26:07 编辑解决方案三://添加控件TextBoxtxt=newTextBox();txt.Text="我是自动添加的";txt.Location=newPoint(10,10);this.Controls.Add(txt);//移除控件this.Controls.Remove(txt);txt.Dispose();解决方案四:privatev

winform-C#WinForm编程中怎么在指定的容器中打开另外的窗体(比如在panel或者其他容器控件)

问题描述 C#WinForm编程中怎么在指定的容器中打开另外的窗体(比如在panel或者其他容器控件) 在编程中做到一个项目想实现一个在点击按钮之后就在本窗体中打开窗体,求大神帮忙! 解决方案 var t = new Form(); t.TopLevel = false; t.Parent = this.panel1; t.Show(); 解决方案二: 在同一界面内隐藏控件点击按钮显示 在控件属性栏通过Visible先隐藏false然后点击按钮事件里 控件(dataGridView1).Visi

在葉面中動態的添加控件

控件 在實際的開發過程中,經常需要根据實際需要動態的加載一些服務器控件或用戶控件,一般又分為靜態和動態加載兩種.下面主要是講如何動態加載控件,在葉面中動態加載控件經常用PlaceHolder控件作為一個容器來裝載這些動態加載的控件.這個例子是當點"BtnAddControl"來添加一個新控件Sub BtnAddControl_Click(Sender As object,e As eventargs) Dim txtBox As textbox = New Textbox '先清除pl

vb.net中实现picturebox中图片拖动和label控件数组结合,实现label和图片同步

控件|数组   在前面的文章中,提到过在vb.net中实现picturebox中图片拖动,以及控件数组方面的东西. 因为项目需要,我要实现的是,图片上有各个站点的名称,我要实现点击相应的名称,进入站点,查看相应的信息.我采取的是在图片上放一系列的label,然后点击label,进入相应的站点,这样就遇到了一个问题,要实现在拖动图片的同时,所有的label也同步拖动. 下面的代码实现了这个功能: Imports System.DrawingNamespace WinForm.Main    Pub

JS中artdialog弹出框控件之提交表单思路详解_javascript技巧

artDialog是一个基于javascript编写的对话框组件,它拥有精致的界面与友好的接口. 前言: 自适应内容 artDialog的特殊UI框架能够适应内容变化,甚至连外部程序动态插入的内容它仍然能自适应,因此你不必去考虑消息内容尺寸使用它.它的消息容器甚至能够根据宽度让文本居中或居左对齐--这一切全是XHTML+CSS原生实现. 完善的接口 它的接口完善,可以轻易与外部程序配合使用.如异步写入消息.控制位置.尺寸.显示与隐藏.关闭等. 细致的体验 如果不是在输入状态,它支持Esc快捷键关

从外部的js文件中获取ASPX页面的控件ClientID_实用技巧

前言 当使用MasterPage.UserControl等容器时,为了避免控件的重复命名,asp.net会自动将容器中的控件生成一个ClientID(Control Tree中的可生成,否则不会生成). 例如:ContentPlaceHolder1中的Button1默认情况下会生成"ctl00_ContentPlaceHolder1_Button1"的ClientID. 我们在Render出来的mark up中看到的也是这些ClientID.所以,当我们使用JavaScript对控件元

软件管家中的软件列表什么控件实现的

问题描述 软件管家中的软件列表什么控件实现的 我想知道软件管家中的软件列表什么控件实现的 如何实现 求解答 解决方案 自定义的,贴图,一般是自己的控件库