重写自定义控件不起作用的 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
我想创建一个自定义文本框。在这里,我希望这个文本框只是为了获取数字作为输入。举个什么例子?
即使KeyEventArgs
是System.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;
}
}
}