我通过数据源(一个BindingList)填充一个已排序的ListBox(lbCustomer)。 BindingList包含具有一堆属性的Items(customer)。 DisplayMember是属性“name”,ValueMember是属性“id”。现在,当单击一个Item时,我在ClickEvent中看到我的lbCustomer是正确的Item,但是SelectedValue是错误的。事实上,lbCustomer.SelectedValue返回id,好像没有排序一样,所以如果我选择ListBox中的第一个项目,它会从我的DataSource-BindingList返回实际的第一个(未排序的)customer.id。这是通常的结果吗?我认为使用DisplayMember和ValueMember是为了防止这种行为。我怎么能阻止这种情况(不需要在开始时对我的BindingList进行排序)?
这是我的list-和combo-Boxes与DataSource连接的代码:
private void SelectCorrectBox(bool dependence)
{
DeactivateEvents();
ChangeItems(lbCustomer, null, Entity.DataSource.LbCustomer.CustomerSource, false);
if(!dependence)
ChangeItems(null, cbCustomer, Entity.DataSource.LbCustomer.CustomerSource, false);
ChangeItems(lbProdukt, null, Entity.DataSource.LbProdukt.ProduktSource, false);
ChangeItems(null, cbProdukt, Entity.DataSource.LbProdukt.ProduktSource, false);
//if(dependence)
ChangeItems(lbVersion, null, Entity.DataSource.LbVersion.VersionSource, false);
ChangeItems(lbKategorie, null, Entity.DataSource.LbKategorie.KategorieSource, false);
ChangeItems(lbFehler, null, Entity.DataSource.LbFehler.FehlerSource, true);
ActivateEvents();
}
private void ChangeItems(ListBox lb, ComboBox cb, object source, bool fehler)
{
if (cb == null)
{
lb.DataSource = source;
if (!fehler)
lb.DisplayMember = "name";
else
lb.DisplayMember = "titel";
lb.ValueMember = "id";
lb.SelectedIndex = -1;
}
else if (cb != null)
{
cb.DataSource = source;
cb.DisplayMember = "name";
cb.ValueMember = "id";
cb.SelectedIndex = -1;
}
}
编辑:
解决方案是使用SelectedItem而不是SelectedValue:
在:
private void lbCustomer_SelectedValueChanged(object sender, EventArgs e)
{
EventStarter(lbCustomer.SelectedValue, "customer");
}
后:
private void lbCustomer_SelectedValueChanged(object sender, EventArgs e)
{
EventStarter(((Entity.Customer)lbCustomer.SelectedItem).id, "customer");
}