SelectedIndices更改了列表框

时间:2012-06-20 20:15:22

标签: c#

是否有一些事件我可以用来判断列表框的SelectedIndices属性何时更改?我想根据项目的某个属性值取消选择列表框中的项目。我已经连接了一个适用于SelectedIndex被更改的事件,但是当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);
     }
}

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:1)

根据MSDN,每次选择更改时都会触发此事件:

  

如果SelectionMode属性设置为SelectionMode.MultiSimple或SelectionMode.MultiExtended,则对SelectedIndices集合的任何更改(包括从选择中删除项目)都将引发此事件。

所以基本上,你可以像使用单一选择一样使用它。

<强>示例:

例如,如果要取消选择null为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对象本身。如果它不起作用,你仍然可以创建这些项目的临时列表并在循环后取消选择它们。)

答案 2 :(得分: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);
                }
            }
        }
    }