Ctrl-A全选这点事(C#,WinForm)
所有的文本框,不管单行多行都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)的更多相关文章
- MFC对话框的Edit控件实现响应Ctrl+A全选,并实现自动/手动换行+滚动条
首先是在Properties中设置控件属性的问题,首先必须得将Mutilines属性设为true,才能支持多行显示. 手动换行(按Enter键换行):将Want Return属性设为true 自动换行 ...
- pycharm中ctrl + C复制, ctrl+A全选等快捷键失效
原因是:在安装pycharm的时候也同时安装了vim插件,需要在settings - > vim Emulation里将相关的handler改成 IDE
- Ctrl-A全选
Ctrl-A全选这点事(C#,WinForm) 所有的文本框,不管单行多行都Ctrl-A全选就好了吧?是啊,很方便.Windows的软件基本都是这样.可为什么我们自己制作的WinForm就默认不是 ...
- Edit Control响应全选(Ctrl+A)
MFC中的Edit控件用于输入数据,当输入的数据为大段数字的时候,全选功能就显得非常重要了,可偏偏在MFC中Edit控件就不 支持全选.Ctrl+A不行,双击也不行. Ctrl+C和Ctrl+V都是默 ...
- PHP基础班初学心得:用JQ实现表单的全选、反选、取消和删除功能
摘要: 本人刚参加PHP基础班培训,由于之前毫无基础,分享的心得可能不规范,方法也许也"旁门左道",不能保证质量,只作自己总结学习,也希望能帮助到同样是初学者的朋友们,共同进步. ...
- jQuery 全选 反选 单击行改变背景色
我先把CSS样式放出来,其实这个可以直接忽略 ;;font-size:12px;font-family:微软雅黑;} .datagrid{width:100%;} .datagird tr th{ba ...
- Java Swing 如何实现记事本中“编辑”菜单下的 剪切,复制,粘贴,删除,全选 功能
这篇文字将要学习以下知识点: 1.如何给JButton按钮添加鼠标点击事件监听器 #1.addMouseListener(MouseListener l) 给JButton添加一个鼠标点击监听器l ...
- HTML,JS禁止鼠标右键、禁止全选、复制、粘贴的方法
禁止鼠标右键.禁止全选.复制.粘贴: oncontextmenu事件禁用右键菜单: js代码: document.oncontextmenu = function(){ event.returnVal ...
- JS禁用浏览器退格键、禁止右键、禁止全选、复制、粘贴
一.禁用浏览器退格键 摘抄自:https://www.cnblogs.com/wanggd/p/3164536.html 我们在真实的项目开发中经常会使用JS 对键盘上的一些按键进行禁用,常见的比如说 ...
随机推荐
- [数据库基础]——图解JOIN
阅读导航 一.概要 二.JOIN分类 三.JOIN分类详解 一.概要 JOIN对于接触过数据库的人,这个词都不陌生,而且很多人很清楚各种JOIN,还有很多人对这个理解也不是很透彻,这次就说说JOIN操 ...
- [异常解决] JLINK 与STM32的SWD连接接线方式
如果我们的板子上只留了4个接口:V3.3,SWDIO,SWDCLK,GND.那么和JTAG的连接关系参见下图: 注意缺口方向.然后GND可以接左边任何一个pin(除了最底下这个PIN). FROM: ...
- OAuth认证原理及HTTP下的密码安全传输
很多人都会问这样一个问题,我们在登录的时候,密码会不会泄露?随便进一个网站,登录时抓包分析,可以看到自己的密码都是明文传输的,在如此复杂的web环境下,我们没有百分的把握保证信息在传输过程中不被截获, ...
- 如何选择靠谱的app外包公司,2017最新资讯
企业在外包开发app之前最纠结的问题就是如何选择一个靠谱的app外包公司.因为一个靠谱的app外包公司非常重要,完全决定了app外包开发的周期.bug.售后服务等各方面问题,可以说app开发外包团队一 ...
- 【Win10 应用开发】实现数据的增量加载
今天,老周有小故事讲,国庆期间.有一次老周在某站台上候公交车.老周旁边也站满了人,突然,有一位头发弄得像电线杆的小伙子,不知为何,没有先兆地就大笑起来. 老周先是看了那小伙子一眼,他手上没有拿什么东西 ...
- 高仿QQ顶部控件之IOS SegmentView
经常会看到QQ上面有一个 消息和电话 的顶部面板,这个空间是IOS7的分段控制,android中没有这个控件,今天在威哥的微信公众号中成功gank到这个自定义控件的实现,下面跟着尝试一波. 首先是定义 ...
- 现代3D图形编程学习-基础简介(1) (译)
本书系列 现代3D图形编程学习 基础简介 并不像本书的其他章节,这章内容没有相关的源代码或是项目.本章,我们将讨论向量,图形渲染理论,以及OpenGL. 向量 在阅读这本书的时候,你需要熟悉代数和几何 ...
- ASP.NET 截获服务器生成的将要发送到客户端的html的方法
有时候我们需要在将服务器端生成的html发送带客户端之前对这些html进行操作,比如生成静态html加之保存.改变生成的html中的某些内容等等,那么久可以通过如下的方案解决. 我总结了两种方式,个人 ...
- C++四种类型转换方式。
类型转换有c风格的,当然还有c++风格的.c风格的转换的格式很简单(TYPE)EXPRESSION,但是c风格的类型转换有不少的缺点,有的时候用c风格的转换是不合适的,因为它可以在任意类型之间转换,比 ...
- Entity Framework Plus 系列目录
Entity Framework Plus 系列文章计划的已经全部写完,可能还有其他功能没有写到,希望大家能够多动手,尝试一下使用,一定会给您带来一些帮助的.文章全部写完,也应该出一个目录方便查看,目 ...