Флажок Проверено изменение статуса зависит от пяти других флажков - PullRequest
0 голосов
/ 15 апреля 2020

У меня всего 6 флажков. Я хочу установить или снять шестой флажок в зависимости от состояния оставшихся 5 флажков. Если какой-либо из двух или более флажков отмечен как истинный, то шестой должен быть истинным, если не ложным. Я пробовал разные заявления if, но не успешно. На данный момент лучшее, что я нашел, - это логи c

  private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        if (checkBox1.Checked == true)
        {
            if (checkBox2.Checked == true || checkBox3.Checked == true || checkBox4.Checked == true || checkBox5.Checked == true)
            {
                checkBox6.Checked = true;
            }
            else
            {
                checkBox6.Checked = false;
            }

        }
        else
        {
            if ((checkBox2.Checked == true || checkBox3.Checked == true) || (checkBox4.Checked == true || checkBox5.Checked == true))
            {
                checkBox6.Checked = true;
            }
            else
            {
                checkBox6.Checked = false;
            }

        }
    }

Эта логи c не работает, когда у меня установлен только один флажок true. в этом состоянии шестой должен быть ложным, но не ложным. Какие-либо предложения?? У меня есть этот код для всех флажков под проверенным событием.

Ответы [ 5 ]

2 голосов
/ 15 апреля 2020

Я бы создал отдельный метод, который каждый из ваших флажков может вызывать события CheckChange:

private void SetCheckBox6()
{
    var checkboxStatuses = new List<bool>
    {
        checkbox1.Checked,
        checkbox2.Checked,
        checkbox3.Checked,
        checkbox4.Checked,
        checkbox5.Checked
    }

    checkbox6.Checked = false;

    if(checkboxStatuses.Where(x => x == true).Count() > 1)
    {
        checkbox6.Checked = true;
    }
}

Используйте его так:

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    //Other logic that needs to happen on check changed...

    SetCheckBox6();
}
2 голосов
/ 15 апреля 2020

Проблема заключается в операторе if в строке 16, потому что, если checkBox1 не установлен и один из других флажков установлен, он автоматически включит checkBox6. Потому что вы в основном проверяете, установлены ли какие-либо из других 4-х флажков, и если один из них не имеет checkBox1 для проверки, он будет go в строке 16 и передаст оператор if, потому что вы используете || операторы, рассмотрите возможность использования операторов && и посмотрите, как они работают.

C# операторов (C# ссылка)

Еще один способ сделать это - проверить элементы управления в форме, если они являются CheckBox, и сосчитать Количество проверенных флажков и уверенность в том, что это не экземпляр checkBox6. Таким образом, вы можете использовать бесконечные checkBoxes и иметь небольшую функцию, которая проверяет их все

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
        {
            int i = 0;
            foreach (CheckBox item in this.Controls) // Loop all checkboxes in form
            {
                if (item.CheckState == CheckState.Checked && item != checkBox6) // Check if checkbox is checked and not instance of checkBox6
                {
                    i++; // Increment amount of checkBoxes checked
                }

            }
            checkBox6.Checked = i >= 2 ? true : false; // enable checkBox6 if more than 2 checkboxes are checked
        }

Не забудьте добавить событие CheckChanged checkBox1_CheckedChanged для всех остальных флажков

1 голос
/ 15 апреля 2020

Вы можете попробовать Linq , чтобы запросить коллекцию (скажем, массив) из CheckBox es

using System.Linq;

...

private void checkBox1_CheckedChanged(object sender, EventArgs e) {
  checkBox6.Checked = new bool[] {
    checkBox1.Checked, 
    checkBox2.Checked, 
    checkBox3.Checked, 
    checkBox4.Checked, 
    checkBox5.Checked}.Count(c => c) >= 2;
}

Не забудьте назначить все checkBox1 .. checkBox5 CheckedChanged обработчики событий в checkBox1_CheckedChanged

1 голос
/ 15 апреля 2020

Попробуйте следующим образом: Добавьте CheckedChanged событие из 1-5 флажков к этому методу.

private void checkBox_CheckedChanged(object sender, EventArgs e)
{
       int count = 0;
       if (checkBox1.Checked)
        count++;
       if (checkBox2.Checked)
        count++;
       if (checkBox3.Checked)
        count++;
       if (checkBox4.Checked)
        count++;
       if (checkBox5.Checked)
        count++;
       checkBox6.Checked = count >= 2;
}
0 голосов
/ 15 апреля 2020

На основании вашей логики c попробуйте

        private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        checkBox6.Checked = false;
        if (checkBox1.Checked && (checkBox2.Checked || checkBox3.Checked || checkBox4.Checked || checkBox5.Checked))
        {
            checkBox6.Checked = true;
        }
        else if ((checkBox2.Checked && checkBox3.Checked) || (checkBox4.Checked && checkBox5.Checked))
        {
            checkBox6.Checked = true;
        }
    }
...