覆盖TextChanged事件以使自定义控件无法正常工作

时间:2012-05-08 15:04:59

标签: c# winforms user-controls override

我在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

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

3 个答案:

答案 0 :(得分:2)

即使KeyEventArgsSystem.EventArgs的子类,C#也不允许您使用子类参数覆盖方法。您需要使用signature from the base class覆盖该方法,然后转换为函数内的KeyEventArgs

protected override void OnTextChanged(System.EventArgs args) {
    KeyEventArgs kpe = (KeyEventArgs)args;
    ...
}

修改 由于OnTextChanged未提供KeyEventArgs,看起来您需要它们,请尝试覆盖其他方法:

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

答案 1 :(得分:0)

@dasblinkenlight已经正确回答了你的问题。

但是,方法Form.OnTextChanged是一种事件提升方法,几乎​​不应该被覆盖。您可能希望在派生类构造函数中创建一个事件处理程序:

this.TextChanged += new EventHandler(OnTextChanged);

BTW,在Visual Studio中,键入+=后按Tab键将为您生成事件处理程序。

答案 2 :(得分:0)

您似乎忘记了事件处理程序中的第一个参数。

将其更改为:

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;
        }
    }