2

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

3 回答 3

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;
}
于 2012-06-20T20:32:50.267 回答
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 对象本身。如果它不起作用,您仍然可以制作这些项目的临时列表并在循环后取消选择它们。)

于 2012-06-20T20:24:17.257 回答
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);
                }
            }
        }
    }
于 2012-06-20T21:01:48.413 回答