好吧……这是我昨天才意识到的难以消化的答案。虽然我没有在问题中提到一件重要的事情,但这是我的错误,因为我觉得它与手头的问题无关:
数据表中的数据未排序。因此我已将列表框的 Sorted 属性设置为 true。后来我意识到,当列表框甚至组合框的排序属性设置为 true 时,值成员不会正确设置。所以如果我写:
lb.SelectedValue = valuePassedByUser;
它将其他一些项目设置为选定状态,而不是设置其值为“Passed User”的项目。简而言之,它扰乱了索引。
例如如果我的初始数据是:
Index ValueMember DisplayMember
1 A Apple
2 M Mango
3 O Orange
4 B Banana
我设置了sorted = true。那么列表框项目是:
Index ValueMember DisplayMember
1 A Apple
2 B Banana
3 M Mango
4 O Orange
现在,如果我想将 Banana 设置为选定状态,我运行 stmt:
lb.SelectedValue = "B";
但它没有将香蕉设置为选定状态,而是将橙色设置为选定状态。为什么?因为如果列表没有排序,Banana 的索引将为 4。因此,即使在排序后 Banana 的索引为 2,它也会将索引 4 设置为选中,从而使 Orange 而不是 Banana 被选中。
因此,对于排序列表框,我使用以下代码来设置所选项目:
private void SetSelectedBreakType(ListBox lb, string value)
{
for (int i = 0; i < lb.Items.Count; i++)
{
DataRowView dr = lb.Items[i] as DataRowView;
if (dr["value"].ToString() == value)
{
lb.SelectedIndices.Add(i);
break;
}
}
}