2011-09-08 112 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; 
      } 
     } 
    } 
}