2011-11-16 20 views
0

我正在學習如何通過從C#中的父類繼承來實現自定義控件。當用戶將信息輸入到文本框中時,什麼方法設置文本框的文本?

我需要重寫用戶輸入文本時觸發的例程。很明顯,我可以添加一個事件來觸發使用TextChanged,但這對我來說似乎是骯髒的清理方法。

我已經考慮覆蓋Text {get;set;}屬性,但這不起作用。

幫助?

+0

什麼不重寫覆蓋文本屬性,你想要做什麼? – mydogisbox

+0

看來Text屬性只在嘗試通過代碼訪問文本框中的內容時使用(並且在運行時並未由最終用戶觸發) – James

回答

2

您可以使用KeyDown事件。請注意,用戶仍然可以粘貼東西而不會產生KeyDown事件。要捕獲所有輸入,您需要像處理想象那樣處理TextChanged;沒有什麼骯髒的。

+0

啊,我是新的自定義控件。我通常的做法是在使用'textbox.TextChanged + ='輸入文本後改變文本。這是「髒」,因爲在瞬間文本框包含不正確的數據。 – James

0

要考慮的一種方法是創建一個擴展標準TextBox的自定義文本框。你可以在override的許多屬性和方法,包括OnKeyPress來處理用戶輸入。

簡單的例子:當用戶進入一個感嘆號

class MyTextBox : TextBox 
{ 
    protected override void OnKeyPress(KeyPressEventArgs e) { 
     if (e.KeyChar == '!') { 
      e.Handled = true; 
     } 
     base.OnKeyPress(e); 
    } 
} 

在這個例子中的TextBox將忽略輸入。您可以像使用標準Winform TextBox控件一樣使用此TextBox。

您可以使用Visual Studio的智能感知來查看可用的override。只要輸入'override'開始在類中創建一個新成員,並且所有可覆蓋的成員都會出現。

編輯 查看this article在codeproject.com上的例子。文章中介紹的控件擴展了TextBox來專門過濾非數字字符,但是您可以輕鬆修改它以篩選出需要過濾的字符。

使用自定義控件的另一個說法是:您可以跨項目重複使用它,而無需每次都重新編碼。

+0

這是我從VB6高中時代開始的常用方法(如果keyascii不需要,請將keyascii設置爲0)。 e.Handled對我來說是新的。然而,這在用戶複製和粘貼時不起作用,並且'OnTextChanged(EventArgs e)'事件參數沒有'.Handled'屬性 – James

+0

@James我確實說過我的是一個簡單的例子。我在codeproject.com上發現了一篇文章,它使用了擴展TextBox的相同技術來完成你需要做的事情,包括處理C&P。 –

相關問題