繁体   English   中英

复选框的If-Else语句

[英]If-Else statement for a checkbox

我遇到以下问题:
当我的程序检查确定的条件时,如果复选框已选中,它将抛出MessageBox两次。 根据调试器,它将进入if内,引发messagebox ,然后发出Checkbox1.Checked == false 之后,它将再次执行整个if条件。
我已经尝试过有关Checkbox1.Threestate MSDN文档,但是我无法实现它。 如何解决此复选框问题?

   private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {

        string currPath = textBox1.Text;
        if (!textBox1.Text.Contains("\\"))
        {
            MessageBox.Show("Please define the input folder before starting");
            checkBox1.Checked = false;                
        }
        else if (!textBox2.Text.Contains("\\"))
        {
            MessageBox.Show("Please define the XML Output folder before starting");
            checkBox1.Checked = false;
        }
        else if (!textBox3.Text.Contains("\\"))
        {
            MessageBox.Show("Please define the Converted PPF Output Folder before starting");
            checkBox1.Checked = false;
        }
        else if (!textBox4.Text.Contains("\\"))
        {
            MessageBox.Show("Please define the Invalid PPF Output Folder before starting");
            checkBox1.Checked = false;
        }
        else
        {
            // calls the watcher
            prg.ProgramProcessing(textBox1.Text);
        }
    }

由于您在checkchange事件中更改了支票,因此会再次触发它,因此您应该取消订阅该事件,然后重新订阅

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    checkBox1.CheckedChanged -= checkBox1_CheckedChanged;

    try
    {
        // Your conditions
    }
    finally
    {
        checkBox1.CheckedChanged += checkBox1_CheckedChanged;
    }
}

一旦设置Checked = false ,就更改其值,然后再次触发Changed事件。

解决此问题的一种方法是使用保护变量,以确保您在处理事件时不会再次浏览代码:

private bool handlingCheckboxChanged;
private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
  if(handlingCheckboxChanged) { return; }
  handlingCheckboxChanged = true;
  try {
    // Your original code
  } finally {
    handlingCheckboxChanged = false;
  }
}

更好的办法是确保用户不能首先选中该复选框,例如,通过处理文本框的更改事件并仅在满足所有条件后才启用您的复选框。

如果未选中复选框,则可以跳过它。

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    if (!checkBox1.Checked) return; //<- this.

    string currPath = textBox1.Text;
    if (!textBox1.Text.Contains("\\"))
    {
        MessageBox.Show("Please define the input folder before starting");
        checkBox1.Checked = false;                
    }
    else if (!textBox2.Text.Contains("\\"))
    {
        MessageBox.Show("Please define the XML Output folder before starting");
        checkBox1.Checked = false;
    }
    else if (!textBox3.Text.Contains("\\"))
    {
        MessageBox.Show("Please define the Converted PPF Output Folder before starting");
        checkBox1.Checked = false;
    }
    else if (!textBox4.Text.Contains("\\"))
    {
        MessageBox.Show("Please define the Invalid PPF Output Folder before starting");
        checkBox1.Checked = false;
    }
    else
    {
        // calls the watcher
        prg.ProgramProcessing(textBox1.Text);
    }
}

您有多种解决方案:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    checkBox1.CheckedChanged -= checkBox1_CheckedChanged;
    // Yours conditions
    checkBox1.CheckedChanged += checkBox1_CheckedChanged;
}

要么

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    if(checkBox1.Checked == false)
    {
        return;
    }
    // your conditions..
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM