如何正确覆盖TextBox.Text属性

本文关键字:Text 属性 TextBox 覆盖 何正确 | 更新日期: 2023-09-27 18:27:23

在Windows窗体和C#中,我继承了TextBox类。我覆盖了TextBox中的Text属性。在我尝试使用TextChanged事件之前,一切都很顺利。由于未调用Text.set属性,OnTextChanged事件在此处无法正常工作。

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个字符。

如何正确覆盖TextBox.Text属性

当您在Text属性setter上设置断点时,很容易看到。您假设在文本框中键入内容将调用setter。事实并非如此。一个解决方案是:

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

但您必须使用_maskPartial()来实现这一点,这肯定不是无关紧要的。