2017-02-09 4 views
2

Что не так с этим кодом? Либо combobox - "Wholesale", либо "Retail" форма показывает второе утверждение (true, true). Если я откажусь от checkbox, то работает else (true, false). Любая идея почему?«если», что не работает отлично

private void checkBox3_CheckedChanged(object sender, EventArgs e) 
    { 
     if (checkBox3.Checked == true || comboBox1.SelectedText == "Standalone") 
     { 

      this.checkBox1.BackColor = Color.Gray; 
      this.checkBox1.Enabled = false; 
      this.checkBox2.BackColor = Color.Gray; 
      this.checkBox2.Enabled = false; 
     } 

     if (checkBox3.Checked == true || comboBox1.SelectedText == "Retail") 
     { 
      this.checkBox1.BackColor = default(Color); 
      this.checkBox1.Enabled = true; 
      this.checkBox2.BackColor = default(Color); 
      this.checkBox2.Enabled = true; 
     } 
     else 
     { 
      this.checkBox1.BackColor = default(Color); 
      this.checkBox1.Enabled = true; 
      this.checkBox2.BackColor = Color.Gray 
      this.checkBox2.Enabled = false; 
     } 

ответ

4

Простой else if и использование && должны сделать трюк:

if (checkBox3.Checked == true && comboBox1.SelectedText == "Standalone") 
{ 
    ... 
    //If this case is true, the following cases are not going to be checked 
} 
else if (checkBox3.Checked == true && comboBox1.SelectedText == "Retail") 
{ 
    ... 
    //If this case is true, the following cases are not going to be checked 
} 
else 
{ 
    ... 
    //No case before was true 
} 

Обратите внимание, что использование в простой if позади if является НЕ так же, как использование в else if за if.

отметить также, что ваш метод checkBox3_CheckedChanged только вызывается после того, как состояние вашего третьего CheckBox был изменен (если вы не приняли метод для других событий)

+3

Просто хочу добавьте, что '== true' не требуется, поскольку' checkbox3.Checked' возвращает bool – bolt19

+0

Теперь он ничего не меняет. Так же, как не принимать никакой команды. Все флажки верны. – Diegoctn

+0

@ bolt19 это не совсем верно, поскольку некоторые реализации флажков имеют три состояния (true, false, null). в таких случаях вам нужно использовать '== true' для проверки состояния. – Yoav

1

Я предлагаю исключая все if здесь и работать с булевыми формулами только. Во-первых, давайте избавиться от надоедливых (checkBox3.Checked == true || comboBox1.SelectedText == "Standalone"):

bool isRetail = checkBox3.Checked && comboBox1.SelectedText == "Retail"; 
bool isStandalone = checkBox3.Checked && comboBox1.SelectedText == "Standalone"; 

Тогда попробуйте угадать, когда CheckBox s должно быть Enabled:

// checkBox2 is enabled if and only if isRetail 
//TODO: can see, how checkBox2 is unreadable? Change the name into, say "boxIsRetail" 
this.checkBox2.Enabled = isRetail; 
// checkBox2 is enabled if and only if neither isRetail nor isStandalone 
//TODO: can see, how checkBox1 is unreadable? Change the name into, say "boxIsNeither" 
this.checkBox1.Enabled = !(isRetail || isStandalone); 

Наконец, мы должны обновить свои Color с. CheckBox «s Color зависит Enabled только:

this.checkBox1.BackColor = this.checkBox1.Enabled ? default(Color) : Color.Gray; 
this.checkBox2.BackColor = this.checkBox2.Enabled ? default(Color) : Color.Gray; 

Собираем все вместе мы имеем

private void checkBox3_CheckedChanged(object sender, EventArgs e) { 
    bool isRetail = checkBox3.Checked && comboBox1.SelectedText == "Retail"; 
    bool isStandalone = checkBox3.Checked && comboBox1.SelectedText == "Standalone"; 

    checkBox2.Enabled = isRetail; 
    checkBox1.Enabled = !(isRetail || isStandalone); 

    //TODO: these lines are good candidate to be extracted into a method "UpdateColor" 
    checkBox1.BackColor = checkBox1.Enabled ? default(Color) : Color.Gray; 
    checkBox2.BackColor = checkBox2.Enabled ? default(Color) : Color.Gray; 
} 

Пожалуйста, обратите внимание, что вы можете легко добавить еще bool переменные, как isWholesale, isReserved и т.д. и реализовать соответствующую логику без роуминга среди деревьев if, else и if else

+0

я Получение каскады ошибок: Ошибка Пространство имен не может непосредственно содержать элементы, такие как поля или методы \t и, Error Ожидаемое класс, делегат, перечисление, интерфейс или структура – Diegoctn

+0

@Diegoctn: кажется, что метод 'private void checkBox3_CheckedChanged (object sender, EventArgs e)' должен быть помещен в класс, например 'Form1':' public partial class Form1: Form {... checkBox3_CheckedChanged (object sender, EventArgs e) {...} ...} ' –

Смежные вопросы