重写自定义控件不起作用的 TextChanged 事件

本文关键字:TextChanged 事件 不起作用 自定义控件 重写 | 更新日期: 2023-09-27 18:33:27

我在 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 '我的项目。HtextBox.OnTextChanged(object, System.Windows.Forms.KeyEventArgs)': 找不到合适的方法来覆盖 E:''my project''myproject''HtextBox.cs

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

重写自定义控件不起作用的 TextChanged 事件

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

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

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

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

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

将其更改为:

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

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

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

this.TextChanged += new EventHandler(OnTextChanged);

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

仅用于输入数字的简单代码,支持删除和退格键。

protected override void OnKeyPress(KeyPressEventArgs e)
{
    if (numberMode)
    {
        if (Char.IsDigit(e.KeyChar) || e.KeyChar == (char)Keys.Back || e.KeyChar == (char)Keys.Delete) { }
        else
        {
            e.Handled = true;
        }
    }
}