最近學習Linq to SQL,發現Linq是一個開發輕量數據庫的好東西,大大簡化了數據連接、查詢過程。但是在綁定ComBoBox的時間發現了一個問題:Linq查詢后得到的數據tolist后,只能實現DataSource綁定,無法賦值DisplayMember和ValueMember,即使賦值后,SelectedValue也得不到想要的數值。例如:
Dim tempProvince = From cust In db.AddressProvince Select New With {.id = cust.ProvinceID, .name = cust.ProvinceName} cmbProvince.DataSource = tempProvince.tolist cmbProvince.DisplayMember = "name" cmbProvince.ValueMember = "id"
在網上搜索了幾天,有說解決的辦法是將List轉換為DataTable,然后綁定,轉換代碼:
''' <summary> ''' List轉換為DataTable ''' </summary> ''' <param name="list">List</param> ''' <returns>DataTable</returns> ''' <remarks></remarks> Public Function ConvertToDataTable(ByVal list As IList) As DataTable Dim table As New DataTable() Dim fields() As PropertyInfo If list.Count > 0 Then fields = list(0).GetType.GetProperties For Each field In fields table.Columns.Add(field.Name, field.PropertyType) Next For Each item In list Dim row As DataRow = table.NewRow() For Each field In fields row(field.Name) = field.GetValue(item) Next table.Rows.Add(row) Next End If Return table End Function
綁定代碼:
Dim tempProvince = From cust In db.AddressProvince Select New With {.id = cust.ProvinceID, .name = cust.ProvinceName} Dim tempdatatable As New DataTable tempdatatable = ConvertToDataTable(tempProvince.ToList) cmbProvince.DataSource = tempdatatable '綁定DataTable數據時引發SelectedIndexChanged事件
cmbProvince.DisplayMember = "name" cmbProvince.ValueMember = "id"
通過上述轉換后,可以正確的綁定到ComBoBox了,但有出現了一個新問題,在綁定數據后引發了SelectedIndexChanged事件,ComBoBox的SelectedValue值還是錯誤的,代碼:
Private Sub cmbProvince_SelectedIndexChanged(sender As Object, e As EventArgs) Handles cmbProvince.SelectedIndexChanged
Dim tempCity = From cust In db.AddressCity Where cust.ProvinceID = cmbProvince.SelectedValue.ToString
Select New With {.id = cust.CityID, .name = cust.CityName}
End Sub
郁悶了半天,靈機一動,更改后的綁定代碼:
Dim tempProvince = From cust In db.AddressProvince Select New With {.id = cust.ProvinceID, .name = cust.ProvinceName} Dim tempdatatable As New DataTable tempdatatable = ConvertToDataTable(tempProvince.ToList)
cmbProvince.DisplayMember = "name" cmbProvince.ValueMember = "id"cmbProvince.DataSource = tempdatatable '重點:DataSource放到了DisplayMember和ValueMember賦值后。
哈哈,問題解決了!......
你以為這就結束了?
NO!
這不是重點,高潮來了:
心血來潮,把轉換過程去掉了,直接綁定Linq查詢結果:
Dim tempProvince = From cust In db.AddressProvince Select cust.ProvinceID, cust.ProvinceName cmbProvince.DisplayMember = "ProvinceName" cmbProvince.ValueMember = "ProvinceID" cmbProvince.DataSource = tempProvince
居然也正常運行了!!!
最后總結:
ComBoBox可以綁定Linq查詢的結果,唯一的要求就將DataSource放在DisplayMember和ValueMember的后面。