添加*或在更改文本框的脏标志时更改背景(组框)颜色

时间:2013-01-14 14:18:14

标签: c# .net winforms properties event-handling

我有一个组合框,背景为包含文本框的特定颜色。我正在考虑如何帮助用户看到文本框是脏的,并认为可能更改背景组框颜色和/或在组框和/或表单文本的名称中添加“*”将是不错的。但我无法让事件甚至改变_isDirty的属性。更别说实现这个想法了。我确信有人做过类似的事情并希望你能帮助我。我正在使用C#.Net framework 2.0(它也应该在4.0中运行,但我相信这是向后兼容的)。 IDE是Visual Studios 10。

这个想法是当文本框被更改时,_isDirty“flag”/“property”将被更改,以及何时保存:

更改文本框时

_isDirty = true

文本框保存后,

_isDirty = false

这就是我现在所拥有的......虽然我尝试了不同的东西,包括根本不适合我的INotify ......

    public static bool _isDirty = false;

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        string newtext = textBox1.Text;
        if (currentText != newtext)
        {
            // This solves the problem of initial text being tagged as changed text
            if (currentText == "")
            {
                _isDirty = false;
            }
            else
            {
                //OnIsDirtyChanged();
                _isDirty = true; //might have to change with the dirty marker
            }
            currentText = newtext;
        }
    }

     public bool IsDirty
    {
        get { return _isDirty; }
        set
        {
            if (_isDirty != value)
            {
                _isDirty = value;
                OnIsDirtyChanged(_isDirty);
            }
        }
    }

    protected void OnIsDirtyChanged(bool _isDirty)
    {
        if (_isDirty == true)
        {
            this.Text += "*";
        }
    }

如果有人对我如何做到这一点有不同的建议,或者用户友好的方式做到这一点,我愿意接受建议......谢谢!

编辑:答案实际上分为两部分! BRAM给出了进行财产变更事件工作的更正。 如果您想知道如何更改背景颜色,请查看ZARATHOS的答案。 不幸的是,我只能标记一个答案,所以要标记一个主要位有效的那个。

2 个答案:

答案 0 :(得分:2)

我更喜欢将文本框背景更改为浅红色(并最终还更改文本以保持可读性),而不触及仅仅是容器元素的组框,并且应保留其完整性以避免混淆用户。如果问题出在文本框中,请突出显示文本框。

private void textBox1_TextChanged(object sender, EventArgs e)
{
    string newtext = textBox1.Text;

    if (currentText != newtext)
    {
        if (currentText == "")
        {
            textBox1.BackColor = SystemColors.Window;
            textBox1.Font = new Font(textBox1.Font, FontStyle.Regular);
        }
        else
        {
            textBox1.BackColor = Color.LightCoral;
            textBox1.Font = new Font(textBox1.Font, FontStyle.Bold);
        }

        currentText = newtext;
    }
}

你不需要任何其他东西。

答案 1 :(得分:1)

您正在设置_isDirty,因此事件不会触发 你需要设置IsDirty。

    if (currentText != newtext)
    {
        // This solves the problem of initial text being tagged as changed text
        if (currentText == "")
        {
            IsDirty = false;
        }
        else
        {
            //OnIsDirtyChanged();
            IsDirty = true; //might have to change with the dirty marker
        }
        currentText = newtext;
    }

这条线错了

OnIsDirtyChanged(_isDirty);

需要

OnIsDirtyChanged(IsDirty);

假设这是通知事件。