2017-05-28 13 views
0

我通常會弄清楚事情的真相,但是這讓我有點心不在焉。使用selectedvaluechanged的C#Listboxes

我有一個窗體和提交按鈕列表框的數組。用戶可以從任何列表框中選擇項目,然後單擊提交按鈕以選擇確認項目,但是需要發生的是如果他們從列表框1中選擇某項,然後改變他們的想法並從列表框2中選擇某項,列表框中選擇的項目1應該被取消選擇。

我可以將它編碼到事件處理程序,但問題是一旦我在另一個列表框中以編程方式更改值,它會觸發另一個事件。我似乎無法按照自己的方式走出困境。

任何想法會很好,否則我想我只需要把多個提交按鈕。

編輯:

我想通了,我覺得到底是一個相當明顯的和簡單的解決方案。我利用重點屬性來區分用戶或程序是否正在進行更改。適用於鼠標和鍵盤選擇。

感謝您的建議...

for (int i = 0; i < treatments.Length; i = i + 1) 
     { 
      this.Controls.Add(ListBoxes[i]); 
      this.Controls.Add(Labels[i]); 
      this.Controls.Add(Spinners[i]); 

      Labels[i].Top = vPosition - 20; 
      Labels[i].Left = hPosition; 
      Labels[i].Width = 600; 

      ListBoxes[i].Left = hPosition; 
      ListBoxes[i].Top = vPosition; 
      ListBoxes[i].Width = 600; 

      Spinners[i].Top = vPosition + ListBoxes[i].Height; 
      Spinners[i].Left = hPosition + ListBoxes[i].Width - 60; 
      Spinners[i].Width = 40; 
      for (int d = 25; d > 0; d = d - 1) { Spinners[i].Items.Add((d).ToString()); } 
      Spinners[i].SelectedIndex = 24; 



      //EVENT HANDLER CODE that is executed if any selectetindexchange in any LIstbox in array 
      ListBoxes[i].SelectedIndexChanged += (sender, e) => 
       { 


        for (int s = 0; s < i; s = s + 1) 

        { 
         //FIND WHICH LBs[s] IS THE SENDING LISTBOX 
         if (ListBoxes[s] == sender && ListBoxes[s].Focused == true) 
         { 
          string msg = "sender is ListBox " + s.ToString() + "\nFocus is" + ListBoxes[s].Focused.ToString(); 
          // MessageBox.Show(msg); 
         } 
         else if(ListBoxes[s].Focused==false) 
         { 
          ListBoxes[s].SelectedIndex = -1; 
         }       


        } 


       }; //end of event handler 

} 
+0

是一個WinForms,Web表單或MVC項目? – hardkoded

+0

你總是可以使用一個標誌。 –

+0

這個問題是類似的,並且答案可能適用於一般策略:[在C#中修改combobox SelectedIndex而不觸發事件](https://stackoverflow.com/questions/3356518/modifying-combobox-selectedindex-without-觸發事件中的c-sharp) – hatchet

回答

0

我通常解決這類問題,一個標誌,讓我知道我改變的東西,所以我的事件處理程序可以檢查該標誌,而不是採取行動在這種情況下。

private int codeChangingCount = 0; 
private void combobox1_SelectedIndexChanged(object sender, EventArgs e) { 
    codeChangingCount++; 
    try { 
     combobox2.SelectedIndex = someNewValue; 
    } finally { 
     codeChangingCount--; 
    } 
} 

private void combobox2_SelectedIndexChanged(object sender, EventArgs e) { 
    if (codeChangingCount == 0) { 
     //I know this is changing because of the user did something, not my code above 
    } 
} 

你可以用一個簡單的bool而不是int做到這一點,但我喜歡的計數器的方法,使我可以不斷遞增中嵌套調用codeChangingCount並不會意外重置。在我的生產代碼中,我有一個致力於這種標記的類,並且它(錯誤)使用IDisposable遞減,因此我可以將我的調用包裝在using塊中,但上面的代碼段更易於說明。

+0

我的確嘗試了這種方法,但我無法讓它與我爲許多列表框使用循環和一個事件處理程序的方式一起工作。 – user8078868

0

檢查重點列表框== ListBox2和SelectedIndex的> -1然後取消選擇指數[0]

if (ListBoxes[s] == sender && ListBoxes[s].Focused == true) 
    { 
     if(s == 1 && ListBoxes[s].SelectedIndex > -1) //assuming 1 is listbox2 
     { 
      ListBoxes[0].SelectedIndex = -1; // Deselect ListBox1 
     } 
     string msg = "sender is ListBox " + s.ToString() + "\nFocus is" + ListBoxes[s].Focused.ToString(); 
    } 
相關問題