C#MessageBox显示两次

时间:2016-04-25 20:49:03

标签: c# winforms

我在Windows窗体上有几个分组框,带有复选框,数字选择器和数字选择器。组合框。如果未选中该复选框,我希望禁用其他元素。除了加载后的复选框,我已经禁用了所有内容,然后编码' if / else' CheckedChanged事件的标准,一切正常。但是,一些组框依赖于早期形式的另一个条件。因此,如果用户尝试选择该复选框但条件无效,我想显示一条消息,取消选中该复选框并禁用组框中的其他元素,直到用户返回并更改条件...或者只是按原样接受事物并继续前进。除了消息框显示两次,即显示,取消,再次显示之外,所有的工作都与预期的一样,除非显示,取消,再次显示...我在选中此框时会再次思考,如果未选中则会再次思考(如果我只是让它检查,但禁用,消息只显示一次,但那有点难看。;-(有没有更好的方法来做到这一点?

private void checkbox1_CheckedChanged(object sender, EventArgs e)
    {
        if(var1 == "YES")
        {
            if (checkbox1.Checked)
            {
                numbox.Enabled = true;
                combobox1.Enabled = true;
            }
            else
            {
                numbox.Enabled = false;
                combobox1.Enabled = false;
            }
        }
        else
        {
            MessageBox.Show("Required condition is not YES");
            checkbox1.Checked = false;
        }
    }

4 个答案:

答案 0 :(得分:1)

就像@LarsTech说的那样......你要两次召集你的活动。 这是一个可能的解决方法。只需在您的方法开头删除您的活动即可。最后......再添加一次。

private void checkbox1_CheckedChanged(object sender, EventArgs e)
    {
        checkbox1.CheckChanged -= checkbox1_CheckedChanged;
        if(var1 == "YES")
        {
            if (checkbox1.Checked)
            {
                numbox.Enabled = true;
                combobox1.Enabled = true;
            }
            else
            {
                numbox.Enabled = false;
                combobox1.Enabled = false;
            }
        }
        else
        {
            MessageBox.Show("Required condition is not YES");
            checkbox1.Checked = false;
        }
        checkbox1.CheckChanged += checkbox1_CheckedChanged;
    }

答案 1 :(得分:1)

您可以删除并读取事件处理程序,如下例所示。

 else
        {
            MessageBox.Show("Required condition is not YES");
            checkbox1.CheckedChanged -= checkbox1_CheckedChanged;
            checkbox1.Checked = false;
            checkbox1.CheckedChanged += checkbox1_CheckedChanged;
        }     

答案 2 :(得分:1)

您可以使用checkbox1_CheckedChanged事件来检测用户输入,而不是checkbox1_Click事件。如果您更改了程序中的checkbox1.Checked状态,则不会引发checkbox1_Click事件。

private void checkbox1_Click(object sender, EventArgs e)
{ 
    //your code 
}

答案 3 :(得分:1)

似乎没有必要显示消息,如果该框已被取消选中则取消选中该框...那么为什么不在显示消息之前检查是否已选中该框,而不是经常摆弄事件登记?

private void checkbox1_CheckedChanged(object sender, EventArgs e)
{
    if(var1 == "YES")
    {
        if (checkbox1.Checked)
        {
            numbox.Enabled = true;
            combobox1.Enabled = true;
        }
        else
        {
            numbox.Enabled = false;
            combobox1.Enabled = false;
        }
    }
    else if (checkbox1.Checked)
    {
        MessageBox.Show("Required condition is not YES");
        checkbox1.Checked = false;
    }
}