2016-01-12 2 views
1

Использование C#, я пытаюсь создать отношения между двумя флажками: 1. chk_PeelTrace и 2. chk_MoveTrace, где только один флажок может быть проверен в то время, так что если PeelTrace начинается как истинный , и я проверяю MoveTrace, тогда MoveTrace должен быть проверен, а PeelTrace должен быть снят.Переключение между двумя C# флажков

Важно, однако, что одновременно обе стороны должны быть сняты одновременно. Я попробовал несколько разных вещей; некоторые из этих альтернатив прокомментированы в приведенном ниже примере.

Независимо от того, что я пытаюсь, я не смог заставить это работать должным образом. Я продолжаю работать в System.StackOverflowException, но не знаю, почему. Любые идеи или предложения о том, как это сделать?

private void chk_PeelTrace_CheckedChanged(object sender, EventArgs e) 
    { 
     ////if (tracePeel) 
     //if (chk_PeelTrace.CheckState.Equals(CheckState.Checked)) 
     if (chk_PeelTrace.Checked) 
     { 
      ////tracePeel = false; 
      //chk_PeelTrace.CheckState = CheckState.Unchecked; 
      chk_PeelTrace.Checked = !chk_PeelTrace.Checked; 
      ////traceMove = false; 
      //chk_MoveTrace.CheckState = CheckState.Unchecked; 
      chk_MoveTrace.Checked = false; 
     } 
     else 
     { 
      ////traceMove = false; 
      //chk_MoveTrace.CheckState = CheckState.Unchecked; 
      chk_MoveTrace.Checked = false; 
      ////tracePeel = true; 
      //chk_PeelTrace.CheckState = CheckState.Checked; 
      chk_PeelTrace.Checked = true;  
     } 
    } 

    private void chk_MoveTrace_CheckedChanged(object sender, EventArgs e) 
    { 
     //if (chk_MoveTrace.Checked == true) 
     ////if (traceMove) 
     //if (chk_MoveTrace.CheckState.Equals(CheckState.Checked)) 
     if (chk_MoveTrace.Checked) 
     { 
      ////traceMove = false; 
      //chk_MoveTrace.CheckState = CheckState.Unchecked; 
      chk_MoveTrace.Checked = !chk_MoveTrace.Checked; 
      ////tracePeel = false; 
      //chk_PeelTrace.CheckState = CheckState.Unchecked; 
      chk_PeelTrace.Checked = false; 
     } 
     else 
     { 
      ////tracePeel = false; 
      //chk_PeelTrace.CheckState = CheckState.Unchecked; 
      chk_PeelTrace.Checked = false; 
      ////traceMove = true; 
      //chk_MoveTrace.CheckState = CheckState.Checked; 
      chk_MoveTrace.Checked = true; 
     } 
    } 
+1

Вы сказали; * только один флажок может быть активным одновременно *. Для этого сценария используйте переключатель вместо флажка внутри группового ящика. – Irshad

ответ

1

Вы почти там, просто добавьте флаг (логическое поле), чтобы отключить обработку событий, вызванных кодом другого обработчика.

private void chk_PeelTrace_CheckedChanged(object sender, EventArgs e) 
{ 
    if (handleChecked) 
    { 
     handleChecked=false; 
     // your handler code 
     handleChecked=true; 
    } 
} 

private void chk_MoveTrace_CheckedChanged(object sender, EventArgs e) 
{ 
    if (handleChecked) 
    { 
     handleChecked=false; 
     // your handler code 
     handleChecked=true; 
    } 
} 
+0

спасибо cyberj0g – Andres

0

, как я понял вопрос, который вы хотите и быть ложным, но и не должно быть верно и в то же время, так как о попытке этот простой код ниже:

private void chk_PeelTrace_CheckedChanged(object sender, EventArgs e) 
    { 
     if (chk_PeelTrace.Checked) 
     { 
      chk_MoveTrace.Checked = false; 
     } 
    } 

    private void chk_MoveTrace_CheckedChanged(object sender, EventArgs e) 
    { 
     if (chk_MoveTrace.Checked) 
     { 
      chk_PeelTrace.Checked = false; 
     } 
    } 

также это работало штраф для меня

+0

Awesome спасибо !! это сработало отлично – Andres

+0

@ Andres: Надеюсь, вы не против принимать его в качестве ответа тоже. – csharpcoder

+0

Я сделал! Я просто новый пользователь, так что он пока не покажет его. – Andres

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