0

所以这看起来应该很容易,但是我不太清楚这里需要的语法,因为我更习惯于 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

4 回答 4

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

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

于 2012-09-28T14:21:13.053 回答
1

SelectedItem您在问题中使用的解决方案实际上比使用SelectedIndexor提供的答案更可靠SelectedValue

  • SelectedIndex很容易越界然后抛出异常。

  • SelectedValue如果两个项目导致相同的值,则可以找到错误的值ToString()

  • SelectedItem直接匹配列表项后面的对象。如果没有匹配项,则列表框将不包含所选项目。您在问题示例中犯的唯一错误是您尝试分配Stringto SelectedItem,但最初您没有填充SelectedItem字符串。你的每件物品的类型是什么DataSource?使用那个会起作用。

示例:如果将myClass类型的项目添加到ListBox.Itemsi1i2,它们将在ListBox中显示它们的值, ,但在ListBox.Items集合中它们将保留为 , , 。然后你可以使用并且项目将被选中。但是如果你尝试,它不会起作用,因为没有匹配。这是您在问题示例中尝试的内容以及为什么它不起作用。i3i1.ToString()i2.ToString()i3.ToString()i1i2i3ListBox.SelectedItem = i2i2ListBox.SelectedItem = i2.ToString()

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

于 2013-09-20T06:46:32.627 回答
0

请改用此代码。

for (var i = 0; i < lstUsers.Items.Count; i++)
    if ((listBox1.Items[i] as YourClass).ID == myID)
      listBox1.SelectedIndex = i;
于 2012-09-28T14:16:00.840 回答
0

我找到了解决方案

lstUsers.DataSource = dtUsers
lstUsers.DisplayMember = "UserName"
lstUsers.ValueMember = "ID"
lstUsers.SelectedValue = dtUsers.Select(String.Format("ID = {0}", myID))(0)("ID")
于 2012-09-28T14:34:43.053 回答