在绑定到DataTable的ListBox上设置SelectedItem

时间:2012-09-28 13:57:04

标签: vb.net winforms .net-4.0 datatable listbox

所以这看起来应该很简单,但我不能完全弄清楚这里需要的语法,因为我更习惯于WPF / c#。基本上我有一个绑定到DataTable的ListBox,我想根据ID值选择一个项目。这样的事情。

lstUsers.DataSource = dtUsers
lstUsers.DisplayMember = "UserName"
lstUsers.SelectedItem = dtUsers.Select(String.Format("ID = {0}", myID))(0)

我可以看到dtUsers.Select(String.Format("ID = {0}", myID))(0)在调试器中返回正确的DataRow,但是设置SelectedItem什么都不做。我确信我在这里遗漏了一些明显的东西,但我所尝试的一切都没有效果。

4 个答案:

答案 0 :(得分:1)

您可以使用LINQ-To-DataSet

var rows = dtUsers.AsEnumerable()
                   .Select((row,index) => new{ row,index })
                   .Where(x => x.row.Field<int>("ID")==myID);
if(rows.Any())
    lstUsers.SelectedIndex = rows.First().index;
VB.NET中的

Dim rows = dtUsers.AsEnumerable().
    Select(Function(r, i) New With {.row = r, .index = i}).
    Where(Function(x) x.row.Field(Of Int32)("ID") = myID)
If rows.Any Then
    lstUsers.SelectedIndex = rows.First().index
End If

请注意,您需要在C#中添加Imports System.Linqusing System.Linq;

答案 1 :(得分:1)

您在问题中使用的{p> SelectedItem实际上比提供SelectedIndexSelectedValue的答案更可靠。

  • SelectedIndex很容易超出界限,然后抛出异常。

  • 如果两个项目导致相同的SelectedValue

    ,则
  • ToString()会找到错误的值

  • SelectedItem直接匹配列表项后面的 对象 。如果没有匹配,则列表框没有选中项目。您在问题中的唯一错误是您尝试将String分配给SelectedItem,但最初您没有使用字符串填充SelectedItem。您DataSource中每件商品的类型是什么?使用那个将有效。

示例:如果您将 myClass 类型的项i1i2i3添加到 ListBox.Items ,他们会在 ListBox 中显示其值i1.ToString()i2.ToString()i3.ToString(),但在 ListBox.Items 集合中它们将保持i1i2i3。然后,您可以使用ListBox.SelectedItem = i2,项目i2将被选中。但是,如果您尝试ListBox.SelectedItem = i2.ToString()则无效,因为无匹配。这就是您在问题中尝试的例子以及它为什么不起作用。

如果您使用列表中的对象,请在工作中坚持使用SelectedItem,不要使用有其缺点的SelectedIndexSelectedValue

答案 2 :(得分:0)

请改用此代码。

for (var i = 0; i < lstUsers.Items.Count; i++)
    if ((listBox1.Items[i] as YourClass).ID == myID)
      listBox1.SelectedIndex = i;

答案 3 :(得分:0)

我找到了解决方案

lstUsers.DataSource = dtUsers
lstUsers.DisplayMember = "UserName"
lstUsers.ValueMember = "ID"
lstUsers.SelectedValue = dtUsers.Select(String.Format("ID = {0}", myID))(0)("ID")
相关问题