Enter as Tab

转载自   http://www.cnblogs.com/yjz302/archive/2010/03/04/1678627.html

年前,第一次使用WinForm开发项目,需要用到用Enter键代替Tab键的功能,所以便在园子里搜了下,果然有许多相关的帖子,有的利用重写重写 ProcessCmdKey 方法,有的利用窗体的KeyDown 事件,还有的用了一个循环。方法还挺多,不过最后我还是选择了黄忠成在《Framework的设计与应用-基于Windows Forms的应用开发实践》中的例子,重写窗体的ProcessDialogKey方法(这种方法园子里也有),代码如下:

 

代码
    public partial class BaseForm : Form
    {
        
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 partial class BaseForm : Form
    {
        
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 partial class BaseForm : Form
    {
        
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);
        }
    }

      这样就解决了问题。

 

      最后,请注意我的第一行代码是:

public partial class BaseForm : Form 

      意思是说这个窗体是一个基窗体(上面的登录窗体就是这个基窗体的子窗体),只要所有的窗体都从这个基窗体继承,那么所有的子窗体都都会有这个功能了,这个地球人都知道,嘿嘿。

posted @ 2010-03-05 11:57  Blink_Star  阅读(204)  评论(0编辑  收藏  举报