惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

人人都是产品经理
人人都是产品经理
量子位
月光博客
月光博客
罗磊的独立博客
宝玉的分享
宝玉的分享
博客园_首页
酷 壳 – CoolShell
酷 壳 – CoolShell
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
WordPress大学
WordPress大学
博客园 - 叶小钗
博客园 - 聂微东
阮一峰的网络日志
阮一峰的网络日志
V
V2EX
雷峰网
雷峰网
博客园 - 三生石上(FineUI控件)
Jina AI
Jina AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - Franky
美团技术团队
爱范儿
爱范儿
V
Visual Studio Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Y
Y Combinator Blog

博客园 - 天使爱比目鱼

微软日期格式的改变造成程序崩溃 .NET 中DataGridViewComboBoxCell控件得Bug VB.NET在基类中定义共享事件(类似于C#中的静态事件) 也谈解决Combobox绑定数据后取值出现System.Data.DataRowView的问题 在SQL Server 2014下面使用的SQL2000的Northwind和Pubs示例数据库 去除Linq to Sql 查询结果中的空格 VS2015中DataGridView的DataGridViewComBoboxCell列值无效及数据绑定错误的解决方法 DevExpress学习笔记1-ProductsDemo.Win 在VB中使用Linq To SQLite注意事项 在VB中利用Nuget包使用SQLite数据库和Linq to SQLite 在C#中利用Nuget包使用SQLite数据库和Linq to SQLite VB.NET中使用Linq TO SQL添加数据后获得自增长列ID [转载代码]VB.NET 中查询 Linq to SQL 执行时的SQL语句 在VS.NET中根据条件设置不同的MainForm 在T-SQL中使用参数将XML数据添加到SQL数据库的XML列 [转载自键舞者]SELECT IDENT_CURRENT(tableName)获得自增长列ID的实现 测试Windows Live Writer 4步搞定:系统必备的安装位置未设置为组件供应商的网站,无法在磁盘上找到 dotNetFx40LP_Client_x86_x64cs.exe 问题的解决方案 VS2010 SP1 简体中文测试通过,繁体未测试 控件命名规范(转自CSDN)
Linq to SQL 绑定 ComboBox
天使爱比目鱼 · 2013-07-24 · via 博客园 - 天使爱比目鱼

最近学习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的后面。