如何在 TextChange 事件中更改 MaskedTextBox 的文本颜色?

How to change text color of a MaskedTextBox on TextChange event?

我有以下 class 来自 MaskedTextBox。
当输入的文本长度小于预定义文本(000000000000,长度为 12)时,我想以红色突出显示文本,否则以绿色突出显示。

在我的自定义 MaskedTextBox class 中,如果输入的文本长度不是 12(无效),我会尝试在 OntextChange 方法覆盖中将文本颜色更改为红色或绿色.
但是我写的代码不行。

颜色一直是红色,不会变。

public partial class MFMaskedTextBox : System.Windows.Forms.MaskedTextBox
{
    private int lengthdefaultetext;

    protected override void OnCreateControl()
    {
        base.OnCreateControl();
        this.Mask = "0000-0000-0000";
        this.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
        this.Font = new System.Drawing.Font("Arial", 16);
        this.TextMaskFormat = System.Windows.Forms.MaskFormat.ExcludePromptAndLiterals;
        this.Text = "000000000000";
        lengthdefaultetext = this.Text.Length;
        this.ForeColor= System.Drawing.Color.Red;
    }

    protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
        if (this.Text.Length != lengthdefaultetext)
        {
            this.ForeColor= System.Drawing.Color.Red;
        }
        else
        {
            this.ForeColor = System.Drawing.Color.Green;
        }
    }

    protected override void OnClick(EventArgs eventargs) {
        base.OnClick(eventargs);
        this.Text = "";
    }
}

确保添加 TextChange 事件处理程序 OnCreateControl

this.TextChanged += new System.EventHandler(this.OnTextChanged);

您没有设置 PromptChar,而控件的文本 (000000000000) 是立即添加的,因此 lengthdefaultetext 始终不同于文本长度(分别为 12 和 14)。

将 PromptChar 设置为预期的 '0' 字符 (this.PromptChar = '0'),设置 ResetOnPrompt to false so it doesn't override AllowPromptAsInput (true as default) and use the MaskFull or MaskCompleted 属性以验证 Mask 是否已填充,根据返回值设置颜色。

InsertKeyMode 设置为 InsertKeyMode.Overwrite,以允许覆盖现有的 0 个字符(当文本已满时无需删除一个以输入新值)。

► 将属性设置移至控件的默认构造函数。你应该总是有一个默认的构造函数。 OnCreateControlOnHandleCreated 可用于 get/set 属性,这些属性取决于控件的句柄是否存在(或其相对于容器的存在)。

如果这些数字在以特定顺序插入时具有特殊含义,您可以创建自定义MaskedTextProvider to validate the input against the Mask. A custom Provider can only be specified as argument in a MaskedTextBox constructor

using System.Drawing
using System.Windows.Forms;

public partial class MFMaskedTextBox : MaskedTextBox
{
    public MFMaskedTextBox()
    {
        Font = new Font("Arial", 16);
        InsertKeyMode = InsertKeyMode.Overwrite;
        ResetOnPrompt = false;
        TextAlign = HorizontalAlignment.Center;
        TextMaskFormat = MaskFormat.ExcludePromptAndLiterals;

        PromptChar = '0';
        Text = "000000000000";
        Mask = "0000-0000-0000";
    }

    protected override void OnTextChanged(EventArgs e)
    {
        base.OnTextChanged(e);
        ForeColor = MaskCompleted ? Color.Green : Color.Red;
    }
}