2011-09-08 107 views
3

我有一个名为cmbSubjects的组合框。我的项目的目的是在测验比赛中改变主题。我希望当选定的项目被更改时,消息框应该询问测验高手,确认他们是否愿意继续,如果在更改之前有关组合框中的主题未解答的问题。如果他们回答“否”,则组合框应选择其先前选择的项目。我得到这个代码来做到这一点,但问题是如果quix主机在消息框上选择NO,消息框会出现两次。我发现原因(在从断点进入代码之后)是,当消息框返回NO时,我的代码将组合框的选定值更改为其先前的值,这会触发事件cmbSubjects_SelectedIndexChanged。我尝试通过添加一个变量来计算消息框出现的次数来修改代码。问题在于它仅在组合框的值第一次更改后才出现。下面的代码实际上是修改后的代码。谁能帮我这个?提前致谢。 (我正在使用C#)MessageBox出现两次C#

private void cmbSubjects_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     if (pnlAvailable.Controls.Count != 0) 
     { 
      if (countMsg < 1) 
      { 
       DialogResult res = MessageBox.Show("There are still available questions. Are you sure you want to change the subject?", "Changing subject...", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1); 
       if (res == DialogResult.Yes) 
       { 
        cmbIndex = cmbSubjects.SelectedIndex; 
        countMsg = 0; 
        switch (cmbSubjects.SelectedIndex) 
        { 
         case 0: 
          subject = "life"; 
          break; 
         case 1: 
          subject = "math"; 
          break; 
         case 2: 
          subject = "physical"; 
          break; 
         case 3: 
          subject = "technology"; 
          break; 
         case 4: 
          subject = "vocational"; 
          break; 
        } 

        GenQstBtns(); 
       } 
       else if (res == DialogResult.No) 
       { 
        countMsg = 1; 
        cmbSubjects.SelectedIndex = cmbIndex; 
       } 
      } 
     } 
    } 

回答

4

可以使用SelectionChangeCommitted事件。

不要使用SelectedIndexChanged或SelectedValueChanged来捕获用户更改,因为当选择以编程方式更改时也会引发这些事件。

因此,如果您使用此事件更改所选项目编程这一事件不会再次

+0

新知识。不知道。谢谢。将尝试它。 – afaolek

+0

谢谢,你刚刚解决了我的问题。希望我可以添加更多+ s。 – afaolek

+0

+1。比提供的所有解决方法(包括我的)要好得多。 – Heinzi

1

是否有可能您有多个处理程序连接了SelectedIndexChanged事件?您可以查看调试器中附加到事件的所有处理程序。

+0

不,我只有一个处理程序,这是它的问题。 – afaolek

1

简单地检查新指标对当前保存指数:

private void cmbSubjects_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    if (pnlAvailable.Controls.Count != 0) 
    { 
     if (cmbSubjects.SelectedIndex != cmbIndex) 
     { 
      DialogResult res = MessageBox.Show("There are still available questions. Are you sure you want to change the subject?", "Changing subject...", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1); 
      if (res == DialogResult.Yes) 
      { 
       cmbIndex = cmbSubjects.SelectedIndex; 
       switch (cmbSubjects.SelectedIndex) 
       { 
        case 0: 
         subject = "life"; 
         break; 
        case 1: 
         subject = "math"; 
         break; 
        case 2: 
         subject = "physical"; 
         break; 
        case 3: 
         subject = "technology"; 
         break; 
        case 4: 
         subject = "vocational"; 
         break; 
       } 

       GenQstBtns(); 
      } 
      else if (res == DialogResult.No) 
      { 
       cmbSubjects.SelectedIndex = cmbIndex; 
      } 
     } 
    } 
} 
+0

这是在我决定使用'countMsg'之前的原始代码。 – afaolek

+0

它的问题是...? –

+0

MessageBox第二次出现 – afaolek

1

你需要从当你手动更改发射抑制IndexChanged事件。

您可以禁用事件:

  else if (res == DialogResult.No) 
      { 
       countMsg = 1; 

       cmbSubjects.SelectedIndexChanged -= cmbSubjects_SelectedIndexChanged; 
       cmbSubjects.SelectedIndex = cmbIndex; 
       cmbSubjects.SelectedIndexChanged += cmbSubjects_SelectedIndexChanged; 

       fireEvent = true; 
      } 
+0

要尝试这些。从未想过在事件处理程序中使用' - ='。希望它能工作。为你+1(即使这不起作用)。学到了新东西。 – afaolek

0

解雇如果我理解正确,你正在尝试做后,最简单的做法很可能会增加一个布尔变量executableSelectedIndexChanged初始化为false。在你的方法中,你可以检查这个bool,如果它是false,那么将它设置为true并打开你的MessageBox。然后,如果答案是肯定的,则将其重新设置为false。如果你的方法开始布尔是,只需将其设置为false并返回:

private bool executingSelectedIndexChanged = false; 
private void cmbSubjects_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    // NEW CODE HERE 
    if (executingSelectedIndexChanged) 
    { 
     executingSelectedIndexChanged = false; 
     return; 
    } 

    if (pnlAvailable.Controls.Count != 0) 
    { 
     if (countMsg < 1) 
     { 

      // NEW CODE HERE 
      executingSelectedIndexChanged = true; 

      DialogResult res = MessageBox.Show("There are still available questions. Are you sure you want to change the subject?", "Changing subject...", MessageBoxButtons.YesNo, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1); 
      if (res == DialogResult.Yes) 
      { 
       // NEW CODE HERE 
       executingSelectedIndexChanged = false; 

       cmbIndex = cmbSubjects.SelectedIndex; 
       countMsg = 0; 
       switch (cmbSubjects.SelectedIndex) 
       { 
        case 0: 
         subject = "life"; 
         break; 
        case 1: 
         subject = "math"; 
         break; 
        case 2: 
         subject = "physical"; 
         break; 
        case 3: 
         subject = "technology"; 
         break; 
        case 4: 
         subject = "vocational"; 
         break; 
       } 

       GenQstBtns(); 
      } 
      else if (res == DialogResult.No) 
      { 
       countMsg = 1; 
       cmbSubjects.SelectedIndex = cmbIndex; 
      } 
     } 
    } 
}