2012-05-08 75 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