是否有一些事件我可以用来判断列表框的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);
}
}
答案 0 :(得分:3)
您可以使用ListBox.SelectedItems
和LINQ查找所有Curves
并newName==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);
}
}
}
}