Ctrl-A全选这点事(C#,WinForm)
2016-05-25 09:19
351 查看
所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便。Windows的软件基本都是这样。可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改变一下,不想再封装太多默认功能吧。反正程序员自己加这点功能也不难。
好了,以上是YY。接下来正式开始。
一开始,我在自己的WinForm的某个文本框内按Ctrl-A,它没有全选,而且发出“噔”一声,提醒我按了一个无效的按键。于是很简单的,加了以下代码,实现了“这一个”文本框的Ctrl-A实现全选功能。
并由属性编辑器或自己在代码中实现了事件的注册: textBox.KeyPress += TextBox_KeyPress;
这样就完事了,真是“这点事”。等等,如果我有30个TextBox不是要写30行注册代码?能不能写个什么一次搞定,整个WinForm内的所有TextBox都支持Ctrl-A,最好连动态加载的TextBox也支持。于是我在Form的ControlAdded事件中判断如果新添加的Control是TextBox则注册KeyPress事件处理方法。
代码运行后,发现部分TextBox有效果,部分没效果。经过调试,发现,直接跟在WinForm(Form1)的有效果,在用户控件(UserControl)中的TextBox则无效果。对照一下代码,是啊,我还应该处理UserControl的ControlAdded事件,哦不,是所有Control的ControlAdded事件。而且控件还会包含控件,所有子子孙孙控件都注册这个事件,这样任何新添加的控件都会被判断是否为TextBox,于是Control_ControlAdded变成这个样子:
经测试,通过。一劳永逸地解决了这个问题,从此不再为这个问题而费神。
2016-04-27补充:在最终版本的Control_ControlAdded方法加上3行注释,从时空的角度来描述原理,让各位看明白它的覆盖范围。由于同时处理了过去和未来,所以 this.ControlAdded +=
new System.Windows.Forms.ControlEventHandler(this.Control_ControlAdded); 这一句不一定要放在 InitializeComponent(); 之前。放哪都行,执行后就整个Form(this)的TextBox有效。
好了,以上是YY。接下来正式开始。
一开始,我在自己的WinForm的某个文本框内按Ctrl-A,它没有全选,而且发出“噔”一声,提醒我按了一个无效的按键。于是很简单的,加了以下代码,实现了“这一个”文本框的Ctrl-A实现全选功能。
private void TextBox_KeyPress(object sender, KeyPressEventArgs e) { TextBox textBox = sender as TextBox; if (textBox == null) return; if (e.KeyChar == (char)1) // Ctrl-A 相当于输入了AscII=1的控制字符 { textBox.SelectAll(); e.Handled = true; // 不再发出“噔”的声音 } }
并由属性编辑器或自己在代码中实现了事件的注册: textBox.KeyPress += TextBox_KeyPress;
这样就完事了,真是“这点事”。等等,如果我有30个TextBox不是要写30行注册代码?能不能写个什么一次搞定,整个WinForm内的所有TextBox都支持Ctrl-A,最好连动态加载的TextBox也支持。于是我在Form的ControlAdded事件中判断如果新添加的Control是TextBox则注册KeyPress事件处理方法。
private void Control_ControlAdded(object sender, ControlEventArgs e) { TextBox textBox = e.Control as TextBox; if (textBox != null) { textBox.KeyPress += TextBox_KeyPress; } } public Form1() { this.ControlAdded += new System.Windows.Forms.ControlEventHandler(this.Control_ControlAdded); InitializeComponent(); }
代码运行后,发现部分TextBox有效果,部分没效果。经过调试,发现,直接跟在WinForm(Form1)的有效果,在用户控件(UserControl)中的TextBox则无效果。对照一下代码,是啊,我还应该处理UserControl的ControlAdded事件,哦不,是所有Control的ControlAdded事件。而且控件还会包含控件,所有子子孙孙控件都注册这个事件,这样任何新添加的控件都会被判断是否为TextBox,于是Control_ControlAdded变成这个样子:
private void Control_ControlAdded(object sender, ControlEventArgs e) { //使“未来”生效 e.Control.ControlAdded += new System.Windows.Forms.ControlEventHandler(this.Control_ControlAdded); //使“子孙”生效 foreach (Control c in e.Control.Controls) { Control_ControlAdded(sender, new ControlEventArgs(c)); } //使“过去”生效 TextBox textBox = e.Control as TextBox; if (textBox != null) { textBox.KeyPress += TextBox_KeyPress; } }
经测试,通过。一劳永逸地解决了这个问题,从此不再为这个问题而费神。
2016-04-27补充:在最终版本的Control_ControlAdded方法加上3行注释,从时空的角度来描述原理,让各位看明白它的覆盖范围。由于同时处理了过去和未来,所以 this.ControlAdded +=
new System.Windows.Forms.ControlEventHandler(this.Control_ControlAdded); 这一句不一定要放在 InitializeComponent(); 之前。放哪都行,执行后就整个Form(this)的TextBox有效。
相关文章推荐
- C# 利用bat文件轻松创建windos 服务
- C# 获取或设置指定 config 文件的值
- C#匹配中文字符串的4种正则表达式分享
- C# 读写txt
- C#进阶系列——WebApi 路由机制剖析:你准备好了吗?
- C#读取XML文件的基类实现
- c#五种访问修饰符作用范围
- C#对文件的字节加密/解密-可逆
- CLR Via C# 第五章(基元类型,引用类型与值类型)(2)——读书笔记
- c#中Thread的基本使用
- 使用C#从TFS获取最新版本
- 30天C#基础巩固------集合,File(文件操作 ),Encoding处理字符集
- VS2010+C#+EmguCV 配置详解
- [C#防止反编译].NET 产品版权保护方案 (.NET源码加密保护)
- C# ORM框架 开源
- C# .NET4.0 改为 到.NET2.0 报错解决方法
- 用Ngen指令加快C#程序的启动速度
- csharp: DBNull and DateTime
- c#---delegate关键字
- C# Delegate(委托)与多线程