之前写过一篇文章关于 DataGridView 如何利用 BindingSource 绑定1:N的多表数据(.NET 2.0 - WinForm Control - DataGridView 数据绑定) 。这里翻出来重写下,将绑定的数据源由 DataSet 换成现在流行的 Entity Framework~
示例代码下载:http://download.csdn.net/source/3273686
使用的是ms sql express数据库,数据库文件的路径需要自行修改。
1.数据的准备:
数据库使用的 Northwind 里的3个表: customers, orders, order details
由数据库导出 Entities Model 的过程这里不说了,直接看看导出的EF:
相比之前的版本 DataSet通过 Relations 属性来保持上面3个表的关系。
DataSet 添加 Relation 的示例代码:
而在EF中,DB中如果已经设置了外键关联,那么EF就能够自动生成实体的关系,就是 Navigation Properties。
通过代码: var order = northwind.Orders.First().Order_Details 可以返回对应 order 的 order_details
2. 数据准备完毕,现在来看看绑定部分的代码:
因为EF已经帮你做完ORM了(不用你写sql,不用你Adapter.Fill),你直接用就可以了。因为 linq2Entities 的延迟加载特性,每次customer变化的时候,其order,order_deails都是即时查询而不是一开始就读入再过滤,所以我们保持一份 ObjectContext 的实例。如果 ObjectContext 在一次绑定之后就销毁,将导致绑定连动失效。在Form_Load时实例化,Form_Closing时销毁:
3. 数据绑定:
1) customerBindingSource直接绑定northwind.Customers
2) orderBindingSource绑定customerBindingSource,并设置DataMember为Customers的Navigation Property——"Orders"
3) orderDetailBindingSource则绑定orderBindingSource,并设置DataMember为Orders的Navigation Property——"Order_Details"
4.数据的Navigate,直接调用BindingSource的MoveXXX()方法就可以了。
到此为止,用BindingSource绑定EF就完成了。运行下看看绑定连动的效果:
接下来,实现一下更新DB的代码,不过已经和BindingSource没什么关系了。
因为默认的绑定是双向绑定,也就是画面上任何的修改,都会影响到EF的缓存,可以通过ObjectStateManager获得所有修改过的Entity(返回的是 IEnumerable<ObjectStateEntry>):
var updated = northwind.ObjectStateManager.GetObjectStateEntries(EntityState.Modified);
ObjectStateEntry里保存着修改过的Entity, 还有所有修改过的属性名,修改前的值,修改后的值,因此你可以利用下面的方法打出log:
弹出Alert信息:
看看效果:提示中有所有修改的Entity的Key,以及修改的属性,修改前和修改后的值。
如果用户点击OK,那么直接调用:northwind.SaveChanges(); 就可以了。
如果用户点击Cancel,还要放弃修改过的数据怎么办?我们可以利用 ObjectContext.Refresh 方法,Refresh 第一参数是一个枚举:
1) RefreshMode.StoreWins 表示放弃本地数据,接受DB的数据。
2) RefreshMode.ClientWins 表示继续保持当前的数据,直到调用SaveChanges() 以当前数据更新到DB。
PS: Refresh主要运用场景是处理并发错误,比如你修改的一条数据,正好也被别的客户端修改了,当调用SaveChanges()的时候会抛出:OptimisticConcurrencyException,在该异常里通过 Refresh 来进一步处理数据。(是放弃还是坚持更新)
扯的有点远了,关于 EF 的并发错误处理,详细可以看 MSDN:http://msdn.microsoft.com/zh-cn/library/bb399228.aspx
调用EF更新的代码:
Refresh 里只用了 northwind.Customers 是因为3个表已经有关联关系,所以只从最上面的表刷新就可以了。
引申:使用 ObjectStateManager.GetObjectStateEntities 还可以简化的画面变化检查处理,不再需要一个个TextBox检查是否发生变化了,一句话搞定。
分享到:
相关推荐
① Error 图标表示的设定 ② 单元格入力值得验证 ③ 用户入力值发生错误时的捕获
取得或者修改当前单元格的内容 ② 设定单元格只读 ③ 不显示最下面的新行 ④ 判断新增行 ⑤ 行的用户删除操作的自定义 ⑥ 行、列的隐藏和删除 ⑦ 禁止列或者行的Resize . ⑧ 列宽和行高以及列头的高度...
.net framework4.0框架 winform页面 数据分页控件 无其他任何引用 c#语言编写。
FastReport.Net+V2013.2.5+For+.Net4.0_附安装与破解_个人测试程序 1.首先安装FastReport.Net+V2013.2.5 For Net 4.0 的原始安装文件[FRNetDemo2010.msi] 2.将FastReport.Net+V2013.2.5+For+.Net4.0文件夹中的所有...
C#WinForm中使用CefSharp.Winform的示例代码,开发环境为VS2010、.NET4.0。CefSharp.Winform版本为49.0.1
[C#] .NET4.0中使用4.5中的 asyncawait 功能实现异步 [C#] .NET4.0中使用4.5中的 asyncawait 功能实现异步 [C#] .NET4.0中使用4.5中的 asyncawait 功能实现异步
C#+Winform实现的自动备份Oracle数据,将软件放置到服务器上,经过配置后,程序会定时去自动备份指定数据库,如果配置了发送邮件,程序会将备份好的数据以附件形式发送到指定邮箱。也使用单次导入导出数据库的功能,...
C#-WinForm(2种dataGridView导出Excel)批量导出,高效率,36列万行,15秒
AForge.NET是一个C#框架,专为计算机视觉和人工智能领域的开发人员和研究人员设计 - 图像处理,神经网络,遗传算法,机器学习,机器人等。
WPF 3D旋转特效.NET4.0运行VS2010源码
新浪微博SDK for .Net 4.0第二版源码 项目描述 第二版SDK的一些新特性: 采用了新浪官方主推的OAuth2.0进行授权和认证 所有接口都升级到了官方V2版的API,也就是说可以用官方V2版的API机型操作了 参考了官方PHP版的...
TCPServer tcpClient udp通信,定时发送,hex字符普通字符 收发...等功能,为基础参考项目
.NET WinForm-复习题 .
.net-winform客户端调用浏览器打开网页源码.多种用途。
1. Base64编码转换功能,支持编码和解码;...2. 基于Visual Studio 2015,C#语言,.Net 4.0框架,WinForm界面开发,Visual Studio 2019可使用; 3. 提供编译好的exe工具(Base64Coder.exe)和相关源码
使用官方2015试用版进行开发后,通过替换引用重新生成。该库基于.net4.0 已完成破解,方便在低版本的运行库上 进行兼容
VS.NET 2005 Winform应用程序数据库DataGridView分页功能实现 对于不知道操作大数据量的数据库的程序员是个很好的demo
TeighaX.NET 4.00.10支持库 支持CAD2000-CAD2013版本 .NET 4.0框架调用 支持DWG 图层文本抽取,PDF导出,浏览PDF,等超级功能,压缩包内只是支持库文件
C# WinForm DataGridViewComboBoxColumn 绑定 自己写的,最简单实例