控制WinForm中Tab键的跳转
一,需求
在Winform中,默认情况下,按下Tab键,光标会按照我们设定的TabIndex值从小到大进行跳转。
但如果用户要求按下Tab键跳转到特定的控件,这种要求还是很合理的,比如用户只想输入几个必须填的项目。
我们可以在配置文件中配置这些必须填写的项目,并设定他们的跳转顺序。这样程序也更加灵活,利于扩展。
二,探索实现方法
1,在每个输入控件的keyDown事件里判断是Tab键,做相应的跳转处理。
最后调查发现按下Tab键,并不会触发控件keyDown事件,Tab键默认被系统处理了,悲剧了。
另外,输入项目太多的时候,这个做法工作量也太大了,不可行。
2,找一个全局点控制,而不分散到每个控件来处理。
方法就是利用Form本身的ProcessCmdKey方法。
看代码吧,备注已经写的很明白了

Dictionary<string, string> tabMap = new Dictionary<string, string>();
private void InitTabMap()
{
// 加入From,To的控件名称,表示按下Tab键从From跳掉To位置
tabMap.Add("textBox3", "textBox7");
tabMap.Add("textBox7", "textBox8");
}
/// <summary>
/// 这个重载函数里可以预先捕捉到一些按键,比如被系统默认捕获了的Tab键
/// 如果要改写Tab键的默认动作,要返回true,表示你已经处理过这个按键了
/// </summary>
/// <param name="msg"></param>
/// <param name="keyData"></param>
/// <returns></returns>
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
Control ctl = this.ActiveControl;
if (keyData == Keys.Tab)
{
if (ctl != null && tabMap.Keys.Contains(ctl.Name))
{
var toCtrls = this.Controls.Find(tabMap[ctl.Name], true);
if (toCtrls.Length > 0)
{
//检查父容器是否是隐藏的
ActivieParentContainerIfNeeded(toCtrls[0]);
toCtrls[0].Focus();
//确实获得了焦点,再吞噬这个按键动作
if (toCtrls[0].Focused)
{
return true;
}
}
}
}
bool ret = base.ProcessCmdKey(ref msg, keyData);
return ret;
}
/// <summary>
/// 有一些控件隐藏在了TabControl的后面,造成Focus不成功。
/// 因为这些控件的Visible为False,必须先使他们的父控件TabPage先选中
/// </summary>
/// <param name="child"></param>
private void ActivieParentContainerIfNeeded(Control child)
{
if (child.Visible)
{
return;
}
Control parent = child.Parent;
while (parent != null)
{
if (parent is TabPage)
{
break;
}
parent = parent.Parent;
}
if (parent is TabPage)
{
TabControl tabCtrl = (TabControl)parent.Parent;
tabCtrl.SelectedTab = (parent as TabPage);
}
}

上面的tabMap,在实际应用中应该从配置文件中读取。
控制WinForm中Tab键的跳转的更多相关文章
- 远程桌面中Tab键不能补全的解决办法
我们曾在之前的一篇文章中介绍了windows远程连接ubuntu的方法,在成功登陆远程桌面环境之后,发现在终端中Tab键不能自动补齐(但是Ctrl +Tab 可以用,但是需要按下组合键才能补全的话,时 ...
- 在VNC中Xfce4中Tab键失效的解决方法
说明 在Ubuntu Server 14.04上安装了xfce4桌面环境,但是却发现在终端中Tab键不能自动补齐(但是Ctrl + I 仍然可以用). 出现这种情况的原因是,由于Tab键的功能被窗口快 ...
- ubuntu VNC中Xfce4中Tab键失效的解决方法
转:https://blog.csdn.net/xuezhisdc/article/details/48662435 说明 在Ubuntu Server 14.04上安装了xfce4桌面环境,但是却发 ...
- source insight 中tab键的设置
转:http://xinzero.com/source-insight-code-alignment-ended.html source insight代码对齐Tab键终极版 以前也写过一个sourc ...
- 如何设置vim中tab键缩进---配置初始化设置
转载自:http://blog.51cto.com/xuding/1725376:加了一些补充说明 问题: Linux系统下,Tab键默认为8个字符,需呀将其修改为4个字符的方式使用 步骤: 1.在用 ...
- Python中tab键自动补全功能的配置
新手学习Python的时候,如何没有tab键补全功能,我感觉那将是一个噩梦,对于我们这种菜鸟来说,刚接触python,对一切都不了解,还好有前辈们的指导,学习一下,并记录下来,还没有学习这个功能小伙伴 ...
- C# winform中组合键奇怪不响应问题
再winform中使用ProcessCmdKey处理快捷键响应,针对单一快捷键响应没有任何问题.但是针对组合键总是无法响应,如下: protected override bool ProcessCmd ...
- 怎样设置linux中Tab键的宽度(可永久设置)
和我的上篇文章一样,能够设置当前用户的Tab键宽度.也能够设置全部用户的Tab键宽度 一.仅设置当前用户的Tab键宽度 输入命令:vim ~/.vimrc 然后:set tabstop=4 //我 ...
- 设置linux中Tab键的宽度(可永久设置)
一.仅设置当前用户的Tab键宽度输入命令:vim ~/.vimrc然后:set tabstop=6 //将Tab键的宽度设置为6保存:ctrl+z+z(或:wq!)OK!二.设置所有用户的Tab键 ...
随机推荐
- 【转】Windows Server 2008 R2下安装 .net framework3.5
原文地址:http://hi.baidu.com/tonny_dxf/item/6831bcdc3d7c06e7b2f7777c [你必须用角色管理工具安装.net framework3.5 ...
- UOJ#310 【UNR #2】黎明前的巧克力 FWT 多项式
原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ310.html 题目传送门 - UOJ#310 题意 给定 $n$ 个数 ,请你选出两个不相交的集合(两个 ...
- 20165235 祁瑛 2018-4 《Java程序设计》第八周学习总结
20165235 祁瑛 2018-4 <Java程序设计>第八周学习总结 教材学习内容总结 操作系统与进程 程序是一段静态的代码,它是应用软件执行的蓝本.进程是程序的一次动态执行过程,它对 ...
- redis的主从机制 master&slave
转载自:https://www.cnblogs.com/qwangxiao/p/9733480.html 一:master&slave的解释? master&slave就是主从复制,主 ...
- Scala-Unit6-final/type关键字、样例类&样例对象
一.关键字 1.final关键字 用final修饰的类:不能被继承 用final修饰的方法:不能被重写 注意:(1)在Scala中变量不需要用final修饰,因为val与var已经限制了变量是否可变 ...
- Context家族
--摘自<android插件化开发指南> 1.ContextWrapper只是一个包装类,没有任何具体的实现,真正的逻辑都在ContextImpl里面 2.应用程序中包含多个Context ...
- iOS app启动流程
最近看了些Runtime Runloop的一些知识.边看边摸索.看到群里有人在问 一些面试题.其中就提到了app的启动流程. 所以这里也研究小结一下,以供自己学习备用. 1.项目要运行,就要有入口. ...
- 自定义sshd服务
1.安装rsyslog服务和sshd服务并启动 2.配置日志文件 vim /etc/rsyslog.conf 在里面添加一行 local*. /var/log/sshd.lo ...
- Android自定义View前传-View的三大流程-Measure
Android自定义View前传-View的三大流程-Measure 参考 <Android开发艺术探索> https://developer.android.google.cn/refe ...
- mysql查询根据时间排序
表数据: mysql查询根据时间排序,如果有相同时间则只查询出来一个 所以需要再判断,如果时间相同,则根据id进行降序排序