2016-03-09 4 views
1

У меня проблема:
Когда моя программа проверяет определенное состояние и если флажок установлен, он дважды бросает MessageBox; согласно отладчику, он входит внутрь if, выдает messagebox, а затем выдает Checkbox1.Checked == false. После этого он снова выполнит все условия if.
Я пробовал MSDN документацию о Checkbox1.Threestate, но я не смог ее реализовать. Что я могу сделать, чтобы решить эту проблему?Оператор If-Else для флажка

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); 
     } 
    } 
+2

Ну да, вы меняете 'checked' статус флажка, так что будет инициировать событие снова – Sayse

ответ

2

Поскольку вы меняете проверку внутри события checkchange, это вызвать его во второй раз, вы должны отказаться от подписки на событие, затем повторно подписать

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

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

Устпешно реализован , Большое спасибо: D –

+0

@Thomas: Я предлагаю (в общем случае) добавить 'try..finally', т. Е.' CheckBox1.CheckedChanged - = checkBox1_CheckedChanged; try {...} finally {checkBox1.CheckedChanged + = checkBox1_CheckedChanged;} 'в случае, если ваша часть кода * имеет' return' или генерирует исключение –

+0

@DmitryBychenko это очень хорошее наблюдение –

1

Как только вы установите 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; 
    } 
} 

Еще лучше было бы, чтобы убедиться, что пользователь не может установить флажок в первую очередь, например, обработкой событий изменения текстовых полей и только включением вашего флажка после выполнения всех условий.

+0

Ваша идея звучит неплохо. Но я хотел бы, чтобы пользователь щелкнул и увидел предупреждающее сообщение для определения папки перед продолжением. Если я просто отключу флажок, он не сможет «попытаться щелкнуть». –

1

Вы можете пропустить его, если флажок не установлен.

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); 
    } 
} 
1

У вас есть несколько решения:

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.. 
} 
Смежные вопросы