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 ...
随机推荐
- 04--深入探讨C++中的引用
深入探讨C++中的引用 引用是C++引入的新语言特性,是C++常用的一个重要内容之一,正确.灵活地使用引用,可以使程序简洁.高效.我在工作中发现,许多人使用它仅仅是想当然,在某些微 ...
- vc++如何创建程序-构造函数
如果给Animal带参,则提示没有缺省的构造函数了,缺省就是不带参数的 改进:从子类当中向基类传递代参的,这样他就会给Animal传递400,300 对一个常量来调用 #include<iost ...
- 初步使用vue中axios
1.下载axios npm install axios --save 2.两种方式使用axios (1)在模块中引入axios 例如:我在用户登陆界面需要使用axios,就在login页面引入,不是全 ...
- linux内核内存分配(一、基本概念)
内存分配是Linux比较复杂也是比较重要的部分,这个和ssd驱动很类似:物理地址和虚拟地址的映射关系.下面总结下最近看到的有关内存分配的内容和自己的理解: 1.一致内存访问和非一致内存访问 上图来自& ...
- ES6标准入门(第三版)学习笔记(1)
ES6声明变量的六种方法 ES5只有两种 var,function命令 ES6新增了let,const,class,import命令 验证var与let用法上的不同 var a = []; for ( ...
- JAVA 上传图片功能
前后端实现上传图片功能(JAVA代码) 1.前端大概 请求头必须为AJAX请求头: 'X-Requested-With': 'XMLHttpRequest' 一般是指网页中存在的Content-Typ ...
- 修改linux新建账户时的过期时间
#!/bin/bash cat << EOF >> /etc/login.defs PASS_MAX_DAYS 90 EOF
- Ubuntu中无法update的解决办法
我输入 sudo apt-get update 出现错误: /etc/apt$ sudo apt-get update Err http://security.ubuntu.com precise-s ...
- jQuery选择器练习中,带空格和不带空格的问题
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- java的数据的类型
1分类: 基本数据类型长度: Java中简单类型,占用字节数, 以及包装类 浮点数的默认类型是Double(8个字节) 如果想直接想一个变量赋值一个float(4个字节)要在数值后面添加f/F 如同向 ...