Enter as Tab
转载自 http://www.cnblogs.com/yjz302/archive/2010/03/04/1678627.html
年前,第一次使用WinForm开发项目,需要用到用Enter键代替Tab键的功能,所以便在园子里搜了下,果然有许多相关的帖子,有的利用重写重写 ProcessCmdKey 方法,有的利用窗体的KeyDown 事件,还有的用了一个循环。方法还挺多,不过最后我还是选择了黄忠成在《Framework的设计与应用-基于Windows Forms的应用开发实践》中的例子,重写窗体的ProcessDialogKey方法(这种方法园子里也有),代码如下:
{
public BaseForm()
{
InitializeComponent();
}
protected override bool ProcessDialogKey(Keys keyData)
{
if (keyData == Keys.Return)
return base.ProcessDialogKey(Keys.Tab);
else
return base.ProcessDialogKey(keyData);
}
}
这段代码的确实现了Enter as Tab的功能,也比较简单。当我们在窗体中按Enter键时,焦点会自动地移动到下一个控件之上,但这也会出现一个副作用,比如说有下面这样一个登录窗体:
当我们输完用户密码后,按Enter键,焦点会移到“确定”按钮之上,而再次按下Enter键后,焦点就会移到“取消”按钮之上,而我需要的是当焦点移到“确定”按钮上时,再次按下Enter键,就要执行“确定”按钮的Click事件处理程序。
所以说之前的那段代码,虽然实现了Enter as Tab的功能,但是还是不能实用,因为一个窗体上一般都会有一个提交按钮的。
如何才能对按钮控件屏蔽这个功能呢?只要对这段代码加一个判断就可以了,如下:
{
public BaseForm()
{
InitializeComponent();
}
protected override bool ProcessDialogKey(Keys keyData)
{
if ((keyData == Keys.Return) && (!(ActiveControl is Button)))
return base.ProcessDialogKey(Keys.Tab);
else
return base.ProcessDialogKey(keyData);
}
}
这样只要碰到按钮控件,Enter就不再 as Tab键了,如果还有其他类型的控件要屏蔽,只要多加个&&((!(ActiveControl is 控件类型))),就行了。
如果有人说,如果我只想屏蔽button1,而不想屏蔽button2,怎么办?好办!看下面:
{
public BaseForm()
{
InitializeComponent();
}
protected override bool ProcessDialogKey(Keys keyData)
{
if ((keyData == Keys.Return) && (ActiveControl.Name != "button1"))
return base.ProcessDialogKey(Keys.Tab);
else
return base.ProcessDialogKey(keyData);
}
}
这样就解决了问题。
最后,请注意我的第一行代码是:
意思是说这个窗体是一个基窗体(上面的登录窗体就是这个基窗体的子窗体),只要所有的窗体都从这个基窗体继承,那么所有的子窗体都都会有这个功能了,这个地球人都知道,嘿嘿。