所以这看起来应该很简单,但我不能完全弄清楚这里需要的语法,因为我更习惯于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什么都不做。我确信我在这里遗漏了一些明显的东西,但我所尝试的一切都没有效果。
答案 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.Linq
(using System.Linq;
)
答案 1 :(得分:1)
SelectedItem
实际上比提供SelectedIndex
或SelectedValue
的答案更可靠。
SelectedIndex
很容易超出界限,然后抛出异常。
SelectedValue
,则 ToString()
会找到错误的值
SelectedItem
直接匹配列表项后面的 对象 。如果没有匹配,则列表框没有选中项目。您在问题中的唯一错误是您尝试将String
分配给SelectedItem
,但最初您没有使用字符串填充SelectedItem
。您DataSource
中每件商品的类型是什么?使用那个将有效。
示例:如果您将 myClass 类型的项i1
,i2
,i3
添加到 ListBox.Items ,他们会在 ListBox 中显示其值i1.ToString()
,i2.ToString()
,i3.ToString()
,但在 ListBox.Items 集合中它们将保持i1
,i2
,i3
。然后,您可以使用ListBox.SelectedItem = i2
,项目i2
将被选中。但是,如果您尝试ListBox.SelectedItem = i2.ToString()
,则无效,因为无匹配。这就是您在问题中尝试的例子以及它为什么不起作用。
如果您使用列表中的对象,请在工作中坚持使用SelectedItem
,不要使用有其缺点的SelectedIndex
或SelectedValue
。
答案 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")