WinForm枚举容器中的控件,实现控件统一事件处理机制
2023-09-27 14:22:14 时间
我们知道,要在应用程序中使用事件,必须提供一个事件处理程序(事件处理方法),这通常用委托来实现。但当想对某个容器中的同类控件的相同事件都实现相同的处理方法时,可能通过枚举容器中的控件并指定相关委托来实现事件的处理。或许你会说,干吗要说得这么复杂,我可以在控件的属性中指定事件处理方法来实现,但当容器中的控件很多,或者在设计过程中加入了新的控件,逐个指定毕竟是很麻烦的一件事。
如下图所示,在应用中有两个文本框,我想指定两个文本框(用户名与密码)的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);
相关文章
- RDIFramework.NET V3.3 WinForm版新增日程管理功能模块
- NET快速信息化系统开发框架 V3.2 ->WinForm部分全部重构为Dev风格界面
- WinForm容器内控件批量效验是否允许为空?设置是否只读?设置是否可用等方法分享
- winform程序开机自启动设置方法总结
- Winform_播放声音文件
- VS2015创建的Winform项目中添加web引用
- C# winform开发:Graphics、pictureBox同时画多个矩形
- Winform系列——好用的DataGridview过滤控件(表格的高级搜索功能)
- 来说说winform和wpf异同,WPF对于新人上手容易吗?
- 一个通过BackgroundWorker实现WinForm异步操作的例子
- WinForm PrintDocument 进行打印标签
- winform 固定splitContainer某一部分大小
- WinForm 下的高性能笔迹方法
- 如何用C#进行Winform MP3播放器开发
- C#winform批量给图片加水印代码
- c#winform中,对DataGridView数据进行操作,一次性保存