如何通过ValueMember选择ListBox项目

6

我有两个具有相同DisplayMember但是不同的ValueMember的项目,想要通过编程方式选择其中一个项目,我该怎么做?

项目:

123 -> Peter Pan
234 -> John Doe
345 -> Peter Pan

我无法通过以下方式选择最后一个“Peter Pan”:
Listbox1.FindStringExact("Peter Pan");

因为这只返回第一个出现的“Peter Pan”。 以下也不起作用,因为它只设置了选定的项目,但不在列表中显示:
Listbox1.SelectedItem = dataTable.Rows.Find(345);

谁能帮我解决这个问题?

我自己找到了一些更多的信息,列表是有序的,因此当我更新DataTable(用于填充列表)时,列表会重新排序,并似乎选择了替换编辑项的位置。

Listbox1.FindStringExact仅在DisplayMember不同时起作用。

2个回答

4
您可以使用您的列表控件的 SelectedValue 属性:
Listbox1.SelectedValue = 345;

这也不起作用,因为列表仍然会获取所选索引并选择该项(列表已排序)。 - Michael van der Horst
@Michael,SelectedIndex可以实现你所说的功能,而SelectedValue则是根据其ValueMember属性查找项目。你试过了吗? - Frédéric Hamidi
@Frédéric 列表已经被排序,因此当我改变了 SelectedValue 时,SelectedIndexChanged 事件就会触发。然后,我通过 ListBox1.SelectedItem 获取选定行,它返回列表中索引为 SelectedValue 的选定项,就在这之前,排序已经改变了列表的排序方式,因此导致获取错误的行。 - Michael van der Horst
@Michael,如果我理解你的问题正确的话,你可以使用selectedRow = dataTable.Rows.Find(Listbox1.SelectedValue);来获取所选行。 - Frédéric Hamidi
@Frédéric,我知道如何获取所选行,但只有当我更新该行并且列表自动更新时,它才会选择该位置上的项目。 - Michael van der Horst
@Michael,我不确定是否理解正确,因此让我们回顾一下:1)您获取当前选定的项目(如何?),2)您修改“DataTable”中关联行内容,3)列表框会更新该项的位置,因此选择另一个项目,4)您想要重新选择刚刚修改的项目? - Frédéric Hamidi

2

您必须通过ListBox控件的DataSource属性分配数据,而不是通过Items.Add方法。之后,您可以使用ValueMember属性选择项目:

listBox1.DataSource = GetPeople();
listBox1.DisplayMember = "Name";
listBox1.ValueMember = "Id";

// Now you can use
listbox1.SelectedValue = 345;

更新:Items是ListBox类的成员,但SelectedValue是ListControl属性,只能使用DataSource。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接