也谈Enter as Tab

      年前,第一次使用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 as Tab

      当我们输完用户密码后,按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 

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

 

 

 

 

你可能感兴趣的:(tab)