控制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键的跳转,布布扣,bubuko.com

时间: 2024-12-22 18:29:33

控制WinForm中Tab键的跳转的相关文章

远程桌面中Tab键不能补全的解决办法

我们曾在之前的一篇文章中介绍了windows远程连接ubuntu的方法,在成功登陆远程桌面环境之后,发现在终端中Tab键不能自动补齐(但是Ctrl +Tab 可以用,但是需要按下组合键才能补全的话,时间久了确实有点烦),功夫不服苦心人,最后在国外的网站上找到了解决方法,下面给出链接,有兴趣的朋友可以看看:http://ubuntuforums.org/archive/index.php/t-1771058.htmlhttps://answers.launchpad.net/ubuntu/+sou

解决VNC中tab键无效的方法

http://ubuntuforums.org/archive/index.php/t-1771058.html I accidentally discovered a fix for this while trying to solve a different problem.edit~/.config/xfce4/xfconf/xfce-perchannel-xml/xfce4-keyboard-shortcuts.xmlfind the line <property name="&l

如何设置vim中tab键缩进---配置初始化设置

问题: Linux系统下,Tab键默认为8个字符,需呀将其修改为4个字符的方式使用 步骤: 1.在用户根陌路下创建文件名为 .vimrc 的系统文件 [[email protected] ~]# cd ~ [[email protected] ~]# pwd /root [[email protected] ~]# vim .vimrc 2.在文件中输入下面的内容并保存 输入内容: set tabstop=4 set shiftwidth=4 [说明] tabstop 表示一个 tab 显示出来

华为命令中Tab键无法自动补全解决办法

一:问题详情 CRT中命令无法使用Tab键自动补全 二:解决办法 原文地址:https://blog.51cto.com/14558454/2450936

如何设置linux中Tab键的宽度(可永久设置)

和我的上篇文章一样,可以设置当前用户的Tab键宽度,也可以设置所有用户的Tab键宽度 一.仅设置当前用户的Tab键宽度 输入命令:vim ~/.vimrc 然后:set tabstop=4   //我这里将Tab键的宽度设置为4 保存:ctrl+z+z(或:wq!) OK! 二.设置所有用户的Tab键宽度 输入命令:vim /etc/vimrc 在vimrc文件的最后添加:set tabstop=4 保存:ctrl+z+z(或:wq!) OK! 这样不管是哪个用户Tab键的宽度都是4了!! 如何

怎样设置linux中Tab键的宽度(可永久设置)

和我的上篇文章一样,能够设置当前用户的Tab键宽度.也能够设置全部用户的Tab键宽度 一.仅设置当前用户的Tab键宽度 输入命令:vim ~/.vimrc 然后:set tabstop=4   //我这里将Tab键的宽度设置为4 保存:ctrl+z+z(或:wq.) OK! 二.设置全部用户的Tab键宽度 输入命令:vim /etc/vimrc 在vimrc文件的最后加入:set tabstop=4 保存:ctrl+z+z(或:wq!) OK! 这样无论是哪个用户Tab键的宽度都是4了!! 怎样

设置python中TAB键自动补全方法

一.创建自动补全脚本如下: vi /tmp/python/tab.py #!/usr/bin/python # python tab file import sys import readline import rlcompleter import atexit import os # tab completion readline.parse_and_bind('tab: complete') # history file histfile = os.path.join(os.environ[

eclipse中tab键设置

1.点击 window->preference-,依次选择 General->Editors->Text Editors,选中右侧的 insert space for tabs;如下图所示,保存,第一步完成: 2.点击 window->preference-,依次选择 java(或C++)->code style ->formatter,点击右侧的editor,选则左侧 tab policy的值为spaces only,确定,应用保存即可,如下图所示: 若出现应用App

vscode中tab键无法触发emmet快捷生成

1.file——preference——setting 2.点击user setting的extensions 3.点击emmet 4.emmet下的edit in settings.json.添加代码 "emmet.triggerExpansionOnTab": true, "emmet.includeLanguages": { "vue-html":"html", "vue":"html&qu