您好,欢迎访问一九零五行业门户网

C#中方向键与回车键切换控件焦点的两种方法

环境:界面上有textbox,combobox等控件。
不建议把左右方向键都用来切换焦点,否则你在textbox里面改变光标所在字符位置就不方便了。
方法一:笨方法,需为每个控件单独注册事件处理
以textbox为例,代码如下:
 1 private void textbox_keydown(object sender, keyeventargs e)           2 {               3     if (e.keycode == keys.down || e.keycode == keys.enter)               4     {                   5         e.suppresskeypress = true;                   6         system.windows.forms.sendkeys.send({tab});               7     }               8     else if (e.keycode == keys.up)               9     {                  10         e.suppresskeypress = true;                  11         system.windows.forms.sendkeys.send(+{tab});              12     }          13 }
方法二:简单方法,无需为每个控件单独注册事件处理,仅需在窗体类上加入如下代码:
 1 //上、下方向键,及回车键切换控件焦点 2 protected override bool processcmdkey(ref message msg, keys keydata) 3 { 4     keys key = (keydata & keys.keycode); 5     if (e.keycode == keys.down || e.keycode == keys.enter)               6     {                                    7     system.windows.forms.sendkeys.send({tab});   8     return true;              9     }              10     else if (e.keycode == keys.up)              11     {                                   12     system.windows.forms.sendkeys.send(+{tab});13     return true;              14     }    15     return base.processcmdkey(ref msg, keydata);16 }
到此,切换控件焦点的功能已实现,现在有个新的需求,窗体界面上有两个combobox控件cmbmeas和cmbremark,我希望在这两个控件上enter回车时提交,而不是切换焦点,那怎么办呢?那就需要判断当前拥有焦点的控件是不是cmbmeas或cmbremark,上面的代码需要稍微改动下,具体代码如下:
 1 //api声明:获取当前焦点控件句柄       2 [dllimport(user32.dll, charset = charset.auto, callingconvention = callingconvention.winapi)] 3 internal static extern intptr getfocus(); 4  5 //获取当前拥有焦点的控件 6 private control getfocusedcontrol() 7 { 8      control focusedcontrol = null; 9      // to get hold of the focused control:10      intptr focusedhandle = getfocus();11      if (focusedhandle != intptr.zero)12          //focusedcontrol = control.fromhandle(focusedhandle);13          focusedcontrol = control.fromchildhandle(focusedhandle);14      return focusedcontrol ;15  }16 17 protected override bool processcmdkey(ref message msg, keys keydata)18 {19     keys key = (keydata & keys.keycode);20     control ctrl = getfocusedcontrol();21     if (e.keycode == keys.down || (key == keys.enter && ctrl.name != cmbmeas && ctrl.name != cmbremark))              22     {                                   23         system.windows.forms.sendkeys.send({tab});  24         return true;             25     }              26     else if (e.keycode == keys.up)              27     {                                   28         system.windows.forms.sendkeys.send(+{tab});29         return true;              30     }    31     return base.processcmdkey(ref msg, keydata);32 }
说明:
control.fromhandle 方法
返回当前与指定句柄关联的控件;如果找不到带有指定句柄的控件,就返回空引用。
control.fromchildhandle 方法
如果需要返回拥有多个句柄的控件,应使用 fromchildhandle 方法。
此方法沿着窗口句柄父级链向上搜索,直到找到与控件关联的句柄。此方法比 fromhandle 方法更可靠,因为它正确返回拥有多个句柄的控件。
对于用户自定义控件,应当使用fromchildhandle 方法。
以上就是c#中方向键与回车键切换控件焦点的两种方法的详细内容。
其它类似信息

推荐信息