消息框出现两次C#

时间:2014-02-09 20:17:48

标签: c# winforms

我想要一个消息框,让用户知道当他们取消选中复选框时,他们将丢失两个相关文本框中的值。问题是当用户点击“取消”时,再次出现消息框。如果用户单击取消,我希望复选框保持选中状态。

if (checkBox1.Checked == false)
{
    checkBox2.Checked = false; checkBox3.Checked = false;
    checkBox4.Checked = false; checkBox5.Checked = false;
    checkBox6.Checked = false; checkBox7.Checked = false;
    checkBox8.Checked = false;//Disable preceeding checkboxes
    enableAllAssessmentsToolStripMenuItem.Checked = false;
}

if (checkBox1.Checked == true)
{
    //Check if checkbox has been checked 
    textBox1.Enabled = true; textBox2.Enabled = true;//Enable that Line's Textboxes
}
else
{
    //Or not
    textBox1.Enabled = false; textBox2.Enabled = false;//Disable that Line's Textboxes
}

if(textBox1.Text.Length != 0 || textBox2.Text.Length != 0)
{
    //If associated textboxes contain text
    DialogResult  Result1 = MessageBox.Show("The numbers you have input on this row will be lost", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
    if (Result1 == DialogResult.OK)
    {
        textBox1.Text = "";
        textBox2.Text = "";
    }
    else if (Result1 == DialogResult.Cancel)
    {
        checkBox1.Checked = true;
    }
}

3 个答案:

答案 0 :(得分:2)

我相信您在CheckedChanged的{​​{1}}处理程序中拥有此代码。如果未检查当前状态checkBox1,则在用户取消消息框时更改其状态,并且您再次执行此处理程序。

如果订阅了handler,则在复选框状态发生变化时无法避免执行。但是你可以取消订阅处理程序:

checkBox1

或使用一些布尔标志来表示这种情况:

checkBox1.CheckedChanged -= checkBox1_CheckedChanged;
checkBox1.Checked = true;
checkBox1.CheckedChanged += checkBox1_CheckedChanged;

或者(可能更好的解决方案)你应该重新考虑你的逻辑。


我认为更好的解决方案是将此复选框void checkBox1_CheckedChanged(object sender, EventArgs e) { if (shouldNotHandle) return; // ... else if (Result1 == DialogResult.Cancel) { shouldNotHandle = true; checkBox1.Checked = true; shouldNotHandle = false; } } 设置为AutoCheck并订阅false事件而不是Click。这将允许您根据条件手动更改复选框的状态:

CheckedChanged

我还将一些代码提取到其他方法中:

private void checkBox1_Click(object sender, EventArgs e)
{
    checkBox1.Checked = !checkBox1.Checked;

    if (textBox1.Text.Length != 0 || textBox2.Text.Length != 0)
    {
        if (UserConfirmedWarning("Numbers will be lost"))
        {
            textBox1.Text = "";
            textBox2.Text = "";
        }
        else
        {
            checkBox1.Checked = true;
        }
    }

    if (!checkBox1.Checked)
        DisablePreceedingCheckboxes();

    SetLineTextboxesEnabled(checkBox1.Checked);
}

答案 1 :(得分:2)

这很令人满意,因为当用户在消息框中单击Canclec时,您将Checked属性设置为true。这会再次触发CheckedChanged事件。

如果您需要选中此复选框,只需使用“flag”并在按下Cancel后将其设置为true以阻止事件被触发。

这样的事情:

if (flag) return;

if (checkBox1.Checked == false)
{
checkBox2.Checked = false; checkBox3.Checked = false;
checkBox4.Checked = false; checkBox5.Checked = false;
checkBox6.Checked = false; checkBox7.Checked = false;
checkBox8.Checked = false;//Disable preceeding checkboxes
enableAllAssessmentsToolStripMenuItem.Checked = false;
}

if (checkBox1.Checked == true)
{
//Check if checkbox has been checked 
textBox1.Enabled = true; textBox2.Enabled = true;//Enable that Line's Textboxes
}
else
{
    //Or not
    textBox1.Enabled = false; textBox2.Enabled = false;//Disable that Line's Textboxes
}

if(textBox1.Text.Length != 0 || textBox2.Text.Length != 0)
{
//If associated textboxes contain text
DialogResult  Result1 = MessageBox.Show("The numbers you have input on this row will be lost", "Warning", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning);
if (Result1 == DialogResult.OK)
{
    textBox1.Text = "";
    textBox2.Text = "";
}
else if (Result1 == DialogResult.Cancel)
{
    flag = true;
    checkBox1.Checked = true;
    flag = false;
}

}

答案 2 :(得分:2)

由于你是在CheckChanged事件处理程序中调用的,并且这确实是你的逻辑所强加的,那么我将使用布尔变量作为标志来避免调用代码两次。

    bool setFromHandler = false;
    ...
    setFromHandler  = true;
    checkBox1.Checked = true;
    ...
    if(setFromHandler)
    {
    ...
    }
    else
    {
    ...
    }

干杯

相关问题