我正在使用ListBox
List<SomeObject>
作为其DataSource
。
当需要从ListBox中删除某个项目时,我将从列表中删除该项目,然后将该列表重新添加为DataSource。
除了列表末尾的项目(包括带有一个项目的列表)之外,这样可以正常工作。在这些情况下,当我尝试重新连接DataSource时出现错误:
InvalidArgument ='0'的值对'SelectedIndex'无效。
这对我来说很有意义 - ListBox试图选择一个现在超出界限的索引。没有意义的是,即使我在重新附加之前立即在ListBox上调用ClearSelected()
,这种行为仍然存在:
if (this.RulesBox.DataSource != null) this.RulesBox.DataSource = null;
this.RulesBox.ClearSelected();
this.RulesBox.DataSource = this.Rules;
正确清除SelectedIndex需要做什么?
答案 0 :(得分:3)
我建议使用BindingSource从列表中删除项目 这将避免将List重新附加到ListBox。
在此示例中,我使用List<string>
ListBox l = new ListBox();
BindingSource bs = new BindingSource();
void Main()
{
Form f = new Form();
Button b = new Button();
b.Click += onclick;
b.Dock = DockStyle.Bottom;
List<string> ls = new List<string>()
{"Steve", "Mark", "John"};
bs.DataSource = ls;
l.DataSource = bs;
l.Dock = DockStyle.Fill;
f.Controls.Add(b);
f.Controls.Add(l);
f.Show();
}
void onclick(object sender, EventArgs e)
{
if(l.SelectedIndex != -1)
{
bs.RemoveAt(l.SelectedIndex);
}
}
顺便说一下,我能用ClearSelected重现你的问题。您似乎需要两次调用ClearSelected以有效地从列表框中的任何项目中删除选择 像这样的东西
this.RulesBox.ClearSelected();
this.RulesBox.ClearSelected();
但是,我认为您应该使用BindingSource而不是分离和重新附加DataSource。只有很少的项目,可能不是什么大问题,但是,如果你有很多项目,我认为你应该注意到这种附加/分离方法会降低性能。
答案 1 :(得分:-1)
这可能会有所帮助:
设置列表框属性Listbox.FormattingEnabled = true
或设置.SelectedValue
从列表框控件FormattingEnabled页面:
将FormattingEnabled
属性设置为true会导致为ListControl
,SelectedIndex
,SelectedValue
和FormattingEnabled
的每个可见成员引发Format事件。相关如下:
如果
FormattingEnabled
为false
,则SelectedIndex
不会设置为-1 当SelectedValue
为空时。如果
FormattingEnabled
为真,则SelectedIndex
将设置为-1SelectedValue
是空白的。