Linq to SQL 綁定 ComboBox


最近學習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的后面。

 

 

 

 

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM