【问题标题】:How to change text color of a MaskedTextBox on TextChange event?如何在 TextChange 事件中更改 MaskedTextBox 的文本颜色?
【发布时间】:2020-06-24 02:50:21
【问题描述】:

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

在我的自定义 MaskedTextBox 类中,如果输入文本的长度不是 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 = "";
    }
}

【问题讨论】:

  • 在文本框中输入什么值?当您在文本框中输入 2 个字符时,它会变为红色吗?
  • 我只是输入数字。由于这条线,颜色是红色的。(this.ForeColor= System.Drawing.Color.Red;)并且不会改变。看来 this.ForeColor= System.Drawing.Color.Red;不能完全工作。
  • 看来 this.ForeColor= System.Drawing.Color.Red;在 textchangeevent 函数中不能完全工作。

标签: c# winforms maskedtextbox


【解决方案1】:

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

将 PromptChar 设置为预期的 '0' 字符 (this.PromptChar = '0'),将 ResetOnPrompt 设置为 false,因此它不会覆盖 AllowPromptAsInput(默认为 true)并使用 MaskFullMaskCompleted属性验证Mask是否被填充,根据返回值设置颜色。

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

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

如果这些数字在以特定序列插入时具有特殊含义,您可以创建自定义MaskedTextProvider 来根据掩码验证输入。自定义 Provider 只能在 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;
    }
}

【讨论】:

  • 谢谢。有效!这正是我想要的,而且更多。
【解决方案2】:

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

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

【讨论】:

  • OP 正在使用从 MaskedTextBox 派生的自定义控件,并且它们正确地覆盖了 OnTextChanged。您通常不会订阅派生控件中的事件。这些控件的使用者会这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多