调用ClearSelected并附加DataSource后,为什么SelectedIndex为0?

时间:2015-03-25 18:28:17

标签: c# winforms listbox

我正在使用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需要做什么?

2 个答案:

答案 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会导致为ListControlSelectedIndexSelectedValueFormattingEnabled的每个可见成员引发Format事件。相关如下:

  

如果FormattingEnabledfalse,则SelectedIndex不会设置为-1   当SelectedValue为空时。

     

如果FormattingEnabled为真,则SelectedIndex将设置为-1   SelectedValue是空白的。