C# 覆盖自定义控件不工作的TextChanged事件

C# 覆盖自定义控件不工作的TextChanged事件,c#,winforms,user-controls,overriding,C#,Winforms,User Controls,Overriding,我在C#Windows应用程序中的自定义用户控件中尝试了以下代码: public partial class HtextBox : DevExpress.XtraEditors.TextEdit { protected override void OnTextChanged(KeyEventArgs kpe) { if (kpe.KeyCode == Keys.D1 || kpe.KeyCode == Keys.D2 ||

我在C#Windows应用程序中的自定义用户控件中尝试了以下代码:

public partial class HtextBox : DevExpress.XtraEditors.TextEdit
{
    protected override void OnTextChanged(KeyEventArgs kpe)
    {
        if (kpe.KeyCode == Keys.D1 ||
            kpe.KeyCode == Keys.D2 ||
            kpe.KeyCode == Keys.D3 ||
            kpe.KeyCode == Keys.D4 ||
            kpe.KeyCode == Keys.D5 ||
            kpe.KeyCode == Keys.D6 ||
            kpe.KeyCode == Keys.D7 ||
            kpe.KeyCode == Keys.D8 ||
            kpe.KeyCode == Keys.D9 ||
            kpe.KeyCode == Keys.D0
            ) {
                base.Text += kpe.KeyValue;
        }
    }
}
我得到了这个错误:

错误1“myproject.HtextBox.OnTextChanged(object,System.Windows.Forms.KeyEventArgs)”:找不到合适的方法来覆盖E:\my project\myproject\HtextBox.cs


我想创建一个自定义文本框。在这里,我想这个文本框只是为了得到数字作为输入。示例是什么?

即使
KeyEventArgs
系统的子类。EventArgs
,C#也不允许您使用子类参数重写方法。您需要使用重写该方法,然后在函数中强制转换为
KeyEventArgs

protected override void OnTextChanged(System.EventArgs args) {
    KeyEventArgs kpe = (KeyEventArgs)args;
    ...
}
编辑: 由于
OnTextChanged
不提供
KeyEventArgs
并且您似乎需要它们,请尝试重写其他方法:

protected override void OnKeyDown(KeyEventArgs kpe) {
    ...
}

@dasblinkenlight已为您的问题提供了正确答案

但是,方法
Form.OnTextChanged
是一种引发事件的方法,几乎不应该被重写。您可能希望在派生类构造函数中创建事件处理程序:

this.TextChanged += new EventHandler(OnTextChanged);

顺便说一句,在Visual Studio中,键入
+=
后按tab键将为您生成一个事件处理程序。

看起来您忘记了事件处理程序中的第一个参数

将其更改为:

protected override void OnTextChanged(Object sender, KeyEventArgs kpe) 
    {
        if (kpe.KeyCode == Keys.D1 ||
            kpe.KeyCode == Keys.D2 ||
            kpe.KeyCode == Keys.D3 ||
            kpe.KeyCode == Keys.D4 ||
            kpe.KeyCode == Keys.D5 ||
            kpe.KeyCode == Keys.D6 ||
            kpe.KeyCode == Keys.D7 ||
            kpe.KeyCode == Keys.D8 ||
            kpe.KeyCode == Keys.D9 ||
            kpe.KeyCode == Keys.D0
            ) {
                base.Text += kpe.KeyValue;
        }
    }

好的,但我现在得到了这个错误:错误1的myproject.HtextBox.OnTextChanged(对象,System.Windows.Forms.KeyEventArgs)“:找不到合适的方法来覆盖E:\my project\myproject\HtextBox.cs运行时错误:无法将类型为“System.EventArgs”的对象强制转换为类型为“System.Windows.Forms.KeyEventArgs”。@hamze我不确定传递给
OnTextChanged
的确切参数类型是什么。您是否可以添加一个较长的
args.GetType()
输出,或者在调试器中停止并查看它是什么?在Visual Studio(包括Express版本)中,单击F12将进入定义。因此,如果您键入一个重写Funcon Base.OnTeXCudid(),然后将光标放在该单词的中间,然后单击F12,它将带您到基类的方法定义。但是,同时,这是一个正确的答案,可能您不想重写该方法!它的行为方式与事件处理程序不同,至少要确保调用基类实现。@hamze它看起来不像您可以在
OnTextChanged
内获得
KeyEventArgs
方法:,这些参数被传递给
OnKeyUp
OnKeyDown
。我现在有一个错误:错误1无法分配给“OnTextChanged”,因为它是一个“方法组”E:\my project\HtextBox.cs抱歉,我的错误。方法名称为TextChanged,自动生成的事件处理程序名称为OnTextChanged(您实际上可以使用任何喜欢的名称)。我编辑了我的答案来解决这个问题。