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)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有效。

Ctrl-A全选的更多相关文章

  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. Edit Control响应全选(Ctrl+A)

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

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

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

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

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

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

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

  7. angular笔记_5(全选/反选)

    全选和反选 BUG:当鼠标点击其中一个选项后,在点击全选按钮,该选项失效 <!DOCTYPE html><html lang="en"><head&g ...

  8. VC++6.0/MFC 自定义edit 限制输入内容 响应复制粘贴全选剪切的功能

    Ctrl组合键ASCII码 ^Z代表Ctrl+z                     ASCII值 控制字符  ASCII值 控制字符  ASCII值 控制字符  ASCII值 控制字符0(00) ...

  9. C#文本框中默认是不允许使用全选的

    C#文本框中默认是不允许使用全选的.可以通过以下事件完成:  private void textBox1_KeyDown(object sender, KeyEventArgs e) {      i ...

  10. 【转】MFC 自定义edit 限制输入十六进制内容 响应复制粘贴全选剪切的功能

    参考地址:MFC 自定义edit 限制输入内容 响应复制粘贴全选剪切的功能   Ctrl组合键ASCII码 ^Z代表Ctrl+z                     ASCII值 控制字符  AS ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之1033数字交换

          题目 解决代码及点评 /* 功能:将一个一维数组中的偶数依次交换.例如有8个元素, 若其中第1.4.5三元素是偶数时应按下图交换. 例子: a[]={2,3,1,6 ...

  2. RFS的web自动化验收测试——第14讲 万能的evaluate

    引言:什么是RFS——RobotFramework+Selenium2library,本系列主要介绍web自动化验收测试方面. ( @齐涛-道长 新浪微博) 这一讲我们重点来介绍一下一个常用的关键字e ...

  3. 浅谈Jquery的使用下篇

    上一篇我们已经探讨了Jquery的有关的内容,简单的选择器以及一些Jquery的属性事件和方法等内容,让我们简单的学到了Jquery的比较基础的内容,下面我们就来探讨Jquery的一些其它的内容,比如 ...

  4. 微软Ajax--UpdatePanel控件

    今天用做日历显示本月的考勤记录,用到了UpdatePanel控件,才发现对这个控件并不太了解,所以找了点儿资料,整理了一下给大家发上来! 一.UpdatePanel的结构 <asp:Script ...

  5. linux安装Eclipse c++环境

    yum install eclipse     yum install eclipse-cdt

  6. linux 控制台使用技巧

    1. 键盘无响应 可能是按下ctrl+s, 此时按下scroll即可解锁 2. 想看上一屏的信息 shift+pageup 3. 打印的信息和错误信息区分 普通信息, 用printf, cout打印的 ...

  7. NLP | 自然语言处理 - 标注问题与隐马尔科夫模型(Tagging Problems, and Hidden Markov Models)

    什么是标注? 在自然语言处理中有一个常见的任务,即标注.常见的有:1)词性标注(Part-Of-Speech Tagging),将句子中的每一个词标注词性,比如名词.动词等:2)实体标注(Name E ...

  8. HDU 4893 Wow! Such Sequence!(2014年多校联合 第三场 G)(线段树)

    磨了一天的线段树,不能说完全搞清楚,只能说有一个大概的了解,靠着模板才把这道题A了,只能说太弱~~! 题意: 初始时有一字符串,全为0. 三种操作: 1 k d - add  把d加到第k个数上去2 ...

  9. rac各节点实例需设置为相同的一些参数

    RAC Parameters That Require Identical Settings • ACTIVE_INSTANCE_COUNT • ARCHIVE_LAG_TARGET • COMPAT ...

  10. Boost下载安装编译配置使用指南(含Windows和Linux

    理论上,本文适用于boost的各个版本,尤其是最新版本1.45.0:适用于各种C++编译器,如VC6.0(部分库不支持),VS2003,VS2005,VS2008,gcc,C++ Builder等.先 ...