1

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

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

4

3 回答 3

2

即使KeyEventArgs是 的子类System.EventArgs,C# 也不允许您使用子类参数覆盖方法。您需要使用基类中的签名覆盖该方法,然后强制转换为KeyEventArgs您的函数内部:

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

编辑: 由于OnTextChanged不提供KeyEventArgs并且看起来您需要它们,请尝试覆盖不同的方法:

protected override void OnKeyDown(KeyEventArgs kpe) {
    ...
}
于 2012-05-08T15:08:45.133 回答
0

@dasblinkenlight 已对您的问题给出了正确答案。

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

this.TextChanged += new EventHandler(OnTextChanged);

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

于 2012-05-08T15:09:01.587 回答
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;
        }
    }
于 2012-05-08T15:13:28.403 回答