我有一個Form類BaseForm,其中有一個方法:
protected void control_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
/*
SendKeys.Send直接在control内部处理消息,不再向外转发;
而ProcessDialogKey则不一定,会转发到control的parent。
*/
if(e.KeyCode==Keys.Enter)
SendKeys.Send("{Tab}");//ProcessDialogKey(Keys.Tab);
}我所新建的Form都是繼承到BaseForm,Form中的TextBox類,我都會為KeyDown事件的注冊方法如下:
this.txtPostalCode.KeyDown += new System.Windows.Forms.KeyEventHandler(this.control_KeyDown);以上代碼都是在.Net2003中完成的,正常運行,打開的Form的設置界面也正常;
現在項目升級到.Net2005,程序編譯后運行正常,control_KeyDown事件也能實現需求,但只要打開的Form中的TextBox有引用control_KeyDown方法的,Form的設置界面就不會顯示控件,只會顯示以下信息: 載入設計工具時發生一或多個錯誤。錯誤列示如下。部分錯誤可以藉由重建專案來修復,但其他錯誤可能需要變更程式碼才行。 方法 'control_KeyDown' 不可以是事件的方法,因為衍生此類別的來源類別已經定義該方法。 
隱藏     於 Microsoft.VisualStudio.Shell.Design.Serialization.CodeDom.CodeDomEventBindingService.UseMethod(IComponent component, EventDescriptor e, String methodName)
於 System.ComponentModel.Design.EventBindingService.EventPropertyDescriptor.SetValue(Object component, Object value)
於 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeAttachEventStatement(IDesignerSerializationManager manager, CodeAttachEventStatement statement)
於 System.ComponentModel.Design.Serialization.CodeDomSerializerBase.DeserializeStatement(IDesignerSerializationManager manager, CodeStatement statement) 我不想自己去重寫一個TextBox類,也不想每個Form中都有control_KeyDown事件,更不想將control_KeyDown事件寫成一個public事件,每個地方都去調用這個public事件,有沒有其它比較簡單的方法?

解决方案 »

  1.   

    直接处理 BaseForm.KeyDown 事件,设置 Form 的 KeyPreview 属性为 True,就可以实现你的功能。也不需要为每个 TextBox 加入事件。
      

  2.   

    设置 Form 的 KeyPreview 属性为 True
      

  3.   

    如果将BaseForm.KeyPreview 属性设为 True,直接处理 BaseForm.KeyDown 事件,对性能是否有什么影响呀?
      

  4.   

    如果将BaseForm.KeyPreview 属性设为 True,直接处理 BaseForm.KeyDown 事件,
    /// <summary>
    /// 引發控件的KeyDown事件
    /// </summary>
    /// <param name="e">KeyEventArgs事件資料</param>
    protected override void OnKeyDown(KeyEventArgs e)
    {
        /*
        SendKeys.Send直接在control内部处理消息,不再向外转发;
        而ProcessDialogKey则不一定,会转发到control的parent。
        */
        if (this.ActiveControl.GetType().Equals(typeof(System.Windows.Forms.TextBox))
            || this.ActiveControl.GetType().Equals(typeof(System.Windows.Forms.ComboBox))
            )
        {
            if (e.KeyCode == Keys.Enter)
                SendKeys.Send("{Tab}");//ProcessDialogKey(Keys.Tab);
            else
                base.OnKeyDown(e);
        }
        else
            base.OnKeyDown(e);
    }
    对性能是否有什么影响呀?
      

  5.   

    如果对性能有影响,那我将Form中的TextBox的KeyDown事件的注冊方法由如下: 
    this.txtPostalCode.KeyDown += new System.Windows.Forms.KeyEventHandler(this.control_KeyDown); 
    改成
    this.txtPostalCode.KeyDown += new System.Windows.Forms.KeyEventHandler(class.control_KeyDown); 
    是否简单,也不会性能有什么影响呀?