0

我有一个带有某种颜色背景的组框,其中包含一个文本框。我在想办法帮助用户看到文本框很脏,并认为改变背景组框颜色和/或在组框和/或表单文本的名称中添加“*”会很好。但是我什至无法更改_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 的答案。不幸的是,我只能标记一个答案,因此要标记使主要部分起作用的答案。

4

2 回答 2

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;
    }
}

你不需要其他任何东西。

于 2013-01-14T14:22:08.977 回答
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);

假设这是通知事件。

于 2013-01-14T14:35:00.320 回答