關于Form中引用繼承Form中方法的問題

cnjack 2008-12-16 04:49:34
我有一個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事件,有沒有其它比較簡單的方法?
...全文
181 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnjack 2008-12-17
  • 打赏
  • 举报
回复
如果对性能有影响,那我将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);
是否简单,也不会性能有什么影响呀?
cnjack 2008-12-17
  • 打赏
  • 举报
回复
如果将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);
}
对性能是否有什么影响呀?
cnjack 2008-12-17
  • 打赏
  • 举报
回复
如果将BaseForm.KeyPreview 属性设为 True,直接处理 BaseForm.KeyDown 事件,对性能是否有什么影响呀?
松花皮蛋 2008-12-16
  • 打赏
  • 举报
回复
设置 Form 的 KeyPreview 属性为 True
CloneCenter 2008-12-16
  • 打赏
  • 举报
回复
直接处理 BaseForm.KeyDown 事件,设置 Form 的 KeyPreview 属性为 True,就可以实现你的功能。也不需要为每个 TextBox 加入事件。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧