C#中方向键与回车键切换控件焦点
环境:界面上有TextBox,ComboBox等控件。
不建议把左右方向键都用来切换焦点,否则你在TextBox里面改变光标所在字符位置就不方便了。
方法一:笨方法,需为每个控件单独注册事件处理
以TextBox为例,代码如下:
private void textbox_KeyDown(object sender, KeyEventArgs e)
{
if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Enter)
{
e.SuppressKeyPress = true;
System.Windows.Forms.SendKeys.Send("{Tab}");
}
else if (e.KeyCode == Keys.Up)
{
e.SuppressKeyPress = true;
System.Windows.Forms.SendKeys.Send("+{Tab}");
}
}
方法二:简单方法,无需为每个控件单独注册事件处理,仅需在窗体类上加入如下代码:
//上、下方向键,及回车键切换控件焦点
protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
Keys key = (keyData & Keys.KeyCode);
if (e.KeyCode == Keys.Down || e.KeyCode == Keys.Enter)
{
System.Windows.Forms.SendKeys.Send("{Tab}");
return true;
}
else if (e.KeyCode == Keys.Up)
{
System.Windows.Forms.SendKeys.Send("+{Tab}");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
到此,切换控件焦点的功能已实现,现在有个新的需求,窗体界面上有两个ComboBox控件cmbMeas和cmbRemark,我希望在这两个控件上Enter回车时提交,而不是切换焦点,那怎么办呢?那就需要判断当前拥有焦点的控件是不是cmbMeas或cmbRemark,上面的代码需要稍微改动下,具体代码如下:
//API声明:获取当前焦点控件句柄
[DllImport("user32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Winapi)]
internal static extern IntPtr GetFocus(); //获取当前拥有焦点的控件
private Control GetFocusedControl()
{
Control focusedControl = null;
// To get hold of the focused control:
IntPtr focusedHandle = GetFocus();
if (focusedHandle != IntPtr.Zero)
//focusedControl = Control.FromHandle(focusedHandle);
focusedControl = Control.FromChildHandle(focusedHandle);
return focusedControl ;
} protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
{
Keys key = (keyData & Keys.KeyCode);
Control ctrl = GetFocusedControl();
if (e.KeyCode == Keys.Down || (key == Keys.Enter && ctrl.Name != "cmbMeas" && ctrl.Name != "cmbRemark"))
{
System.Windows.Forms.SendKeys.Send("{Tab}");
return true;
}
else if (e.KeyCode == Keys.Up)
{
System.Windows.Forms.SendKeys.Send("+{Tab}");
return true;
}
return base.ProcessCmdKey(ref msg, keyData);
}
说明:
Control.FromHandle 方法
返回当前与指定句柄关联的控件;如果找不到带有指定句柄的控件,就返回空引用。
Control.FromChildHandle 方法
如果需要返回拥有多个句柄的控件,应使用 FromChildHandle 方法。
此方法沿着窗口句柄父级链向上搜索,直到找到与控件关联的句柄。此方法比 FromHandle 方法更可靠,因为它正确返回拥有多个句柄的控件。
对于用户自定义控件,应当使用FromChildHandle 方法。
C#中方向键与回车键切换控件焦点的更多相关文章
- 在WebBrowser中通过模拟键盘鼠标操控网页中的文件上传控件(转)
引言 这两天沉迷了Google SketchUp,刚刚玩够,一时兴起,研究了一下WebBrowser. 我在<WebBrowser控件使用技巧分享>一文中曾谈到过“我现在可以通过WebBr ...
- Xamarin自定义布局系列——PivotPage,多页面切换控件
PivotPage ---- 多页面切换控件 PivotPage是一个多页面切换控件,类似安卓中的ViewPager和UWP中的Pivot枢轴控件. 起初打算直接通过ScrollView+StackL ...
- Qt控件焦点切换
们日常切换控件,例如QQ登陆的账号和密码输入框就可以通过Tab键切换焦点. 图1 qq切换焦点 Qt中QWidget提供了一个静态方式实现该效果 其中也包含介绍使用 [static] void QW ...
- .Net中使用无闪刷新控件时提示框不显示
今天做提示框的时候一直不显示,让我郁闷好久,晚上吃饭的时候问了同事一下,他给了一个思路, 他说可能是因为由于页面中的无闪刷新导致的结果:百度了一下真找到了解决方法 在页面中存在无闪刷新控件的时候提示框 ...
- WPF 中动态创建、删除控件,注册控件名字,根据名字查找控件
动态创建控件 1.容器控件.RegisterName("Name",要注册的控件) //注册控件 2.容器控件.FindName("Name") as 控 ...
- 在Qt中使用AnyCAD三维建模控件
AnyCAD C++ SDK专为Qt框架增加了AnyPlatformQt.lib模块,在Qt中使用AnyCAD三维建模控件变得十分简单. 下载 Qt高速下载:http://pan.baidu.com/ ...
- asp.net中遍历界面上所有控件进行属性设置
* 使用方法: * 前台页面调用方法,重置: protected void Reset_Click(object sender, EventArgs e) { ...
- EXTJS 4.2 资料 控件textfield中fieldLabel去掉冒号,控件label的长度
代码: labelSeparator: '', // 去掉laebl中的冒号 labelWidth: 10,//控件label的长度
- 弹出框页面中使用jquery.validate验证控件
弹出框页面中使用jquery.validate验证控件有几个问题需要解决: 1,弹出框的提交事件完成后如何关闭弹出框页面? 2,提交不成功如何返回当前页? 3,如果知道验证事件成功? 之前笔者都是JS ...
随机推荐
- Zabbix系列-REHL6.10离线方式安装Zabbix 4.0 LTS
环境 第零步:关闭系统默认防火墙 setenforce 0 sed -i -r "/^SELINUX=/c SELINUX=disabled" /etc/selinux/confi ...
- BZOJ 3940: [Usaco2015 Feb]Censoring AC自动机_栈
Description Farmer John has purchased a subscription to Good Hooveskeeping magazine for his cows, so ...
- Python——Day2(笔记代码)
# test = "大pandaboy"# v=test.capitalize()#首字母大写,当为汉字时失效# print(v)######################### ...
- int rc = -EINVAL是什么意思
rc应该是return code的意思,将函数返回值rc初始化为-EINVAL,EINVAL由POSIX.1规范中的一个宏,一般通过包含C标准头文件errno.h,表示参数无效(invalid arg ...
- P1546 最短网络 Agri-Net (kruskal)
题目背景 农民约翰被选为他们镇的镇长!他其中一个竞选承诺就是在镇上建立起互联网,并连接到所有的农场.当然,他需要你的帮助. 题目描述 约翰已经给他的农场安排了一条高速的网络线路,他想把这条线路共享给其 ...
- HTML常用标签简介及快速入门
此HTML常用标签简介编写的目的,是给一个经常使用网页编辑器的一个朋友提供一个快速熟悉和入门HTML的途径. 现在分享出来,给其他有类似需求的朋友,此处只列出了编辑文章时最常用和遇到的标签,完整标签页 ...
- ASP.NET - 单元测试
Assert类的使用 Assert.Inconclusive() 表示一个未验证的测试: Assert.AreEqual() 测试指定的值是否相等,如果相等,则测试通过: AreSame() 用于验证 ...
- 洛谷 P3014 [USACO11FEB]牛线Cow Line
P3014 [USACO11FEB]牛线Cow Line 题目背景 征求翻译.如果你能提供翻译或者题意简述,请直接发讨论,感谢你的贡献. 题目描述 The N (1 <= N <= 20) ...
- POJ 2133
类似于DP一样做,但这题有个大坑,自己看DIS吧.... #include <iostream> #include <cstdio> #include <cstring& ...
- 我的Android进阶之旅------> Android为TextView组件中显示的文本加入背景色
通过上一篇文章 我的Android进阶之旅------> Android在TextView中显示图片方法 (地址:http://blog.csdn.net/ouyang_peng/article ...