2012-06-20 88 views
2

是否有一些事件可以用來判斷SelectedIndices屬性是否更改爲列表框?我想根據項目的某個屬性值取消選擇列表框中的項目。我已經連接了一個適用於SelectedIndex更改的事件,但不知道如何在SelectedIndices屬性更改爲多選時執行此操作。SelectedIndices已更改列表框

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    Curve curItem = (Curve)listBox1.SelectedItem; 
    int index = listBox1.Items.IndexOf(curItem); 

    if (curItem.newName == null) 
    { 
      listBox1.SetSelected(index, false); 
    } 
} 

回答

1

根據MSDN,本次活動將每次選擇更改觸發:

如果SelectionMode屬性設置爲SelectionMode.MultiSimple或SelectionMode.MultiExtended,到將selectedIndices收集的任何變化,包括從選擇中刪除項目,將引發此事件。

所以基本上,你可以像使用單一選擇一樣使用它。

樣品:

例如,如果你想取消與空的所有項目了newName:

foreach (var item in listBox1.SelectedItems) 
{ 
    if ((item as Curve).newName == null) 
    { 
     int index = listBox1.SelectedItems.IndexOf(item); 
     listBox1.SetSelected(index, false); 
    } 
} 

(我不知道,如果你可以因爲它取消foreach循環內的物品更改SelectedItems對象本身如果它不起作用,您仍然可以創建這些項目的臨時列表,並在循環後取消選擇它們。)

+0

沒有注意到這個MSDN網頁上的摘錄。改變了一下代碼,現在它工作的很好。 – John

+1

您還應該刪除事件處理程序,並在稍後再次添加它,就像在我的答案中一樣。否則,這是一個無限循環,你會得到一個'StackOverflowException'。除此之外,由於您正在修改'foreach'中的'SelectedItems'集合,因此會出現'InvalidOperationException'。 –

3

您可以使用ListBox.SelectedItems和LINQ查找全部CurvesnewName==null以取消選擇它們:

private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
{ 
    var nullNameCurves = listBox1.SelectedItems 
     .Cast<Curve>() 
     .Where(c => c.newName == null) 
     .ToList(); 
    listBox1.SelectedIndexChanged -= listBox1_SelectedIndexChanged; 
    foreach (Curve curve in nullNameCurves) 
     listBox1.SetSelected(listBox1.Items.IndexOf(curve), false); 
    listBox1.SelectedIndexChanged += listBox1_SelectedIndexChanged; 
} 
0
private void listBox1_SelectedIndexChanged(object sender, EventArgs e) 
    { 
     Curve curItem = null; 
     for (int i = 0; i < listBox1.SelectedItems.Count; i++) 
     { 
      curItem = (Curve)listBox1.SelectedItems[i]; 
      if (curItem != null) 
      { 
       int index = listBox1.Items.IndexOf(curItem); 

       if (curItem.newName == null) 
       { 
        listBox1.SetSelected(index, false); 
       } 
      } 
     } 
    }