2012-03-09 149 views
2

Windows Forms和C#中,我從TextBox類繼承。我重寫TextBox的Text屬性。一切都很順利,直到我嘗試使用TextChanged事件。 OnTextChanged事件在此處無法正常工作,因爲Text.set屬性未被調用。如何正確覆蓋TextBox.Text屬性

Initial field content 123, txpText.Text = 123 
Field content changed to a , txpText.Text still 123 
Field content changed to aa , txpText.Text still 123 
Field content changed to aaa , txpText.Text still 123 

這裏是我的自定義文本框代碼

public class ShowPartialTextBox : System.Windows.Forms.TextBox 
{ 
    private string _realText; 
    public override string Text 
    { 
     get { return _realText; } 
     set // <--- Not invoked when TextChanged 
     { 
      if (value != _realText) 
      { 
       _realText = value; 
       base.Text = _maskPartial(_realText); 
       //I want to make this _maskPartial irrelevant 
      } 
     } 
    } 

    protected override void OnTextChanged(EventArgs e) 
    { 
     //Always called. Manually invoke Text.set here? How? 
     base.OnTextChanged(e); 
    } 

    private string _maskPartial(string txt) 
    { 
     if (txt == null) 
      return string.Empty; 
     if (_passwordChar == default(char)) 
      return txt; 
     if (txt.Length <= _lengthShownLast) 
      return txt; 
     int idxlast = txt.Length - _lengthShownLast; 
     string result = _lpad(_passwordChar, idxlast) + txt.Substring(idxlast); 
     return result; 
    } 
} 

這裏是Form類

public partial class Form1 : Form 
{ 
    private ShowPartialTextBox txpText; 

    private void InitializeComponent() 
    { 
     txpText = new ShowPartialTextBox(); 
     txpText.Text "123"; 
     txpText.TextChanged += new System.EventHandler(this.txpText_TextChanged); 
    } 

    private void txpText_TextChanged(object sender, EventArgs e) 
    { 
     label1.Text = txpText.Text; //always shows 123 
    } 
} 

我用_maskPartial。它正在修改顯示的文本,同時仍保留其真實內容。我想要這個自定義的TextBox「幾乎」模擬PasswordChar屬性,並顯示最後的x個字符。

回答

3

當您在Text屬性設置器上設置斷點時很容易看到。你假設在文本框中輸入將會調用setter。它沒有。一個補丁修復的是:

protected override void OnTextChanged(EventArgs e) { 
    _realText = base.Text; 
    base.OnTextChanged(e); 
} 

但是,你將不得不作出與_maskPartial()的工作,它肯定是不無關係。

+0

你有問題了。在TextBox中鍵入不會自動調用setter。我無法使用_realText = base.Text,因爲base.Text已包含更改的顯示文本。 實質上我希望Text = _realText + base.Text中的更改 – 2012-03-09 02:23:52

+0

我添加了_maskPartial()。其中一個目標是使這個不相關。 – 2012-03-09 19:23:23