所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便。Windows的软件基本都是这样。可为什么我们自己制作的WinForm就默认不是这样呢?谁知道呢,可能是WinForm饱受诟病,要改变一下,不想再封装太多默认功能吧。反正程序员自己加这点功能也不难。

好了,以上是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)) // 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有效。

Ctrl-A全选这点事(C#,WinForm)的更多相关文章

  1. MFC对话框的Edit控件实现响应Ctrl+A全选,并实现自动/手动换行+滚动条

    首先是在Properties中设置控件属性的问题,首先必须得将Mutilines属性设为true,才能支持多行显示. 手动换行(按Enter键换行):将Want Return属性设为true 自动换行 ...

  2. pycharm中ctrl + C复制, ctrl+A全选等快捷键失效

    原因是:在安装pycharm的时候也同时安装了vim插件,需要在settings  - > vim Emulation里将相关的handler改成 IDE

  3. Ctrl-A全选

    Ctrl-A全选这点事(C#,WinForm)   所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是 ...

  4. Edit Control响应全选(Ctrl+A)

    MFC中的Edit控件用于输入数据,当输入的数据为大段数字的时候,全选功能就显得非常重要了,可偏偏在MFC中Edit控件就不 支持全选.Ctrl+A不行,双击也不行. Ctrl+C和Ctrl+V都是默 ...

  5. PHP基础班初学心得:用JQ实现表单的全选、反选、取消和删除功能

    摘要: 本人刚参加PHP基础班培训,由于之前毫无基础,分享的心得可能不规范,方法也许也"旁门左道",不能保证质量,只作自己总结学习,也希望能帮助到同样是初学者的朋友们,共同进步. ...

  6. jQuery 全选 反选 单击行改变背景色

    我先把CSS样式放出来,其实这个可以直接忽略 ;;font-size:12px;font-family:微软雅黑;} .datagrid{width:100%;} .datagird tr th{ba ...

  7. Java Swing 如何实现记事本中“编辑”菜单下的 剪切,复制,粘贴,删除,全选 功能

    这篇文字将要学习以下知识点: 1.如何给JButton按钮添加鼠标点击事件监听器 #1.addMouseListener(MouseListener l)  给JButton添加一个鼠标点击监听器l ...

  8. HTML,JS禁止鼠标右键、禁止全选、复制、粘贴的方法

    禁止鼠标右键.禁止全选.复制.粘贴: oncontextmenu事件禁用右键菜单: js代码: document.oncontextmenu = function(){ event.returnVal ...

  9. JS禁用浏览器退格键、禁止右键、禁止全选、复制、粘贴

    一.禁用浏览器退格键 摘抄自:https://www.cnblogs.com/wanggd/p/3164536.html 我们在真实的项目开发中经常会使用JS 对键盘上的一些按键进行禁用,常见的比如说 ...

随机推荐

  1. Visual Studio 2015 移动跨平台开发初体验

    微软换了新 CEO 后变化很大,对我们团队最有利的消息就是 Visual Studio 2015 支持移动应用跨平台开发. 还记不记得很早之前,Xamarin 宣布与微软成为合作伙伴的消息.显然,Xa ...

  2. ABP框架 - 领域事件(EventBus)

    文档目录 本节内容: EventBus 注入 IEventBus 获取默认实例 定义事件 预定义事件 处理完异常 实体修改 触发事件 处理事件 处理基类事件 处理程序异常 处理多个事件 处理程序注册 ...

  3. cmder添加右键菜单

    http://www.jianshu.com/p/b691b48bcee3 就这么简单 Cmder.exe /REGISTER ALL

  4. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  5. 引用MVC源码的小问题

    vs2010自己创建的MVC项目,排除掉System.Web.Mvc引用后,引用源码,直接运行会提示引用冲突,这个是因为配置文件的问题,只要把配置文件中assemblies节点下的 <add a ...

  6. 前端学HTTP之数据传输

    × 目录 [1]客户机处理 [2]集线器处理 [3]路由器1处理[4]路由器2处理[5]交换机处理[6]服务器处理[7]反向传输 前面的话 上一篇中,介绍了网络基础.本文将详细介绍客户机在浏览网页ab ...

  7. Linux文件系统的实现

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! Linux文件管理从用户的层面介绍了Linux管理文件的方式.Linux有一个树状 ...

  8. Geotrellis系列文章链接

    本文存放了我在博客园中撰写的Geotrellis系列文章链接,方便查阅! 一.geotrellis使用初探 二.geotrellis使用(二)geotrellis-chatta-demo以及geotr ...

  9. 【NLP】基于自然语言处理角度谈谈CRF(二)

    基于自然语言处理角度谈谈CRF 作者:白宁超 2016年8月2日21:25:35 [摘要]:条件随机场用于序列标注,数据分割等自然语言处理中,表现出很好的效果.在中文分词.中文人名识别和歧义消解等任务 ...

  10. iOS 调试工具

    仪表  xcode5 引入了调试仪表,通过仪表可以直观的看出应用的CPU和内存占用量.运行一个程序,点击仪表栏.可以发现当程序处于运行状态时,调试导航面板会以柱状图显示CPU和内存占用量,并随着应用实 ...