2012-09-28 44 views
0

所以這看起來應該很容易,但我不能完全弄清楚所需的語法,因爲我更習慣於WPF/c#。基本上我有一個綁定到DataTable的ListBox,我想根據ID值選擇一個項目。像這樣的東西。在ListBox上設置SelectedItem綁定到DataTable

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

我找到了解決方案

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

改爲使用此代碼。

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

這似乎不起作用,'YourClass'在這種情況下是DataRow,它給了我一個無效的投射。這也是在VB中不是C#。 –

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.Linqusing System.Linq;在C#)

+0

這是在VB而不是C#,即使它是一個.NET 4.0項目,它最近被轉換,我寧願完成這個沒有LINQ,所以我不必添加更多的DLL引用到項目。 –

+0

@KDiTraglia:我忽略了VB.NET標記,很抱歉。 [LINQ的](http://msdn.microsoft.com/en-us/library/system.linq.aspx)'System.Core.dll'通常在4.0中自動添加。 –

+0

這是爲新項目,但這是從一箇舊的vb6應用程序轉換(我寧願不添加DLL引用這樣一個微不足道的變化)。我發現了一個解決方案*見下文*,這很容易,沒有LINQ。但感謝您的答案。 –

1

SelectedItem您在問題中使用的是實際上比使用SelectedIndexSelectedValue提供的答案更可靠的解決方案。

  • SelectedIndex可以很容易地跑出界限,然後拋出異常。

  • SelectedValue可以找到錯誤的值,如果兩個項目導致相同ToString()

  • SelectedItem比賽直接對象後面的列表項。如果沒有匹配,則列表框被保留而沒有選定的項目。在你的問題的例子中唯一的錯誤是你試圖將String分配到SelectedItem,但最初你沒有用字符串填充SelectedItemDataSource中的每件物品的類型是什麼?使用那個將會工作。

例如:如果添加項目i1i2,類型i3myClass的ListBox.Items,他們將在列表框中顯示它們的值i1.ToString()i2.ToString()i3.ToString()但在ListBox.Items集合他們將保持i1i2,i3。然後你可以使用ListBox.SelectedItem = i2和項目i2將被選中。但是,如果您嘗試ListBox.SelectedItem = i2.ToString(),它不會工作,因爲有不匹配。這就是你在你的問題中的例子,以及爲什麼它不起作用。

如果您使用列表中的對象,請在作品中使用SelectedItem,不要使用SelectedIndexSelectedValue,這些都有它們的缺點。

相關問題