2012-05-08 73 views
1

我想这个代码在一个C#Windows应用程序,我的自定义用户控件:覆盖TextChanged事件定制控件无法正常工作

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

我得到这个错误:

Error 1 'myproject.HtextBox.OnTextChanged(object, System.Windows.Forms.KeyEventArgs)': no suitable method found to override E:\my project\myproject\HtextBox.cs

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

回答

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) { 
    ... 
} 
+0

运行时错误:无法投类型的对象System.EventArgs为键入“System.Windows.Forms.KeyEventArgs”。 – hamze

+0

@hamze我不知道传递给'OnTextChanged'的参数的确切类型是什么。你可以添加'args.GetType()'长输出还是停在调试器中,看看它是什么? – dasblinkenlight

+0

在Visual Studio(包括Express版本)中,单击F12会带您进入定义。因此,如果您在重写函数base.OnTextChanged()中键入内容,然后将光标置于该单词的中间并单击F12,它应该将您带到基类的方法定义。 – zmilojko

0

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

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

this.TextChanged += new EventHandler(OnTextChanged); 

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

+0

我现在有这个错误:错误无法分配给'OnTextChanged',因为它是'方法组'\t E:\我的项目\ HtextBox.cs – hamze

+1

对不起,我的坏。方法名称是TextChanged,并且自动生成的事件处理程序名称是OnTextChanged(您可以使用任何您喜欢的名称)。我编辑了我的答案来解决这个问题。 – zmilojko

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

好吧,但我现在得到这个错误:错误'myproject.HtextBox.OnTextChanged(object,System.Windows.Forms.KeyEventArgs)':找不到合适的方法覆盖\t E:\ my project \ myproject \ HtextBox。 CS – hamze