说说WebForm:

数据列表控件:

WebForm 下的列表绑定控件基本就是GridView、DataList、Repeater;当然还有其它DropDownList、ListBox等。

它们的共同的设置数据源方法:

XXX.DataSource=数据源。

那么这个数据源的格式,究竟有啥要求?最简单的方式是随便给弄个,然后等它抛异常:

从上面的错误可以看的出来,基本上支持三种数据源绑定方式:IListSource,IEnumerable,IDataSource。

说说Winform

数据列表控件:

WinForm 下的列表绑定控件基本就是DataGridView、ListView、ComboBox等。

它们的共同的设置数据源方法:

XXX.DataSource=数据源。 

用同样的方式,发现它是死活不抛异常的,通过对DataGridView的DataSource查看代码:

 一个不够再看一下ComboBox的DataSource:

从以上的提示可以得到信息,数据源支持:IListSource接口。

看看WPF

数据列表控件:

WPF 下的列表绑定控件基本就是DataGrid、ListBox、ComboBox等。

它们的共同的设置数据源方法:

XXX.ItemsSource=数据源。 

对于WPF,它的ItemsSource不再是Object类型,而是IEnumerable:

从以上的提示可以得到信息,数据源支持:IEnumerable接口。

三者比较:

WebForm: IListSource,IEnumerable,IDataSource。

Winform: IListSource

WPF:   IEnumerable

共同点:

由于IListSource的接口有个必须的实现是返回IList,而IList接口本身也有继承自IEnumerable接口。
所以最终的共同点就是都IEnumerable接口,通俗的说就是都支持:List<T>集合这样的数据源。

不同点:(以IDataReader,DataTable,DataSet等通用集合来说明)

WebForm:支持IDataReader,DataTable,DataSet。
Winform:不支持IDataReader, 支持DataTable,DataSet。 
WPF:支持IDataReader,不支持DataTable,DataSet。

这里面又有些故事:

Winform:为虾米不支持IDataReader?

对于DataGridView列表控件,其实表格是可以直接修改的,而且修改的值,会直接返改到绑定的数据源上。
可能出于这种性质,对于只读的IDataReader来说,它不太适合DataGridView控件上的读写双需求,所以不支持。

Winform下的DataTable绑定:

对于List<T>,可以方便的修改集合的属性,而对于DataTable,这是个复杂的自定义类,要绑定的东西并不是表的基本属性,而是存在另一个集合DataRowCollection中。
所以,设计人员搞出了:PropertyDescriptor 和ICustomTypeDescriptor等一套规范来实现属性描述和自定义类的取值绑定问题。

WPF:竟然不考虑DataTable支持:

估计双方没沟通好,或者是考虑到新的DataGrid又返朴归真,去掉了写的需求,WPF竟然不支持DataTable, 好在还有个属性DefaultView,可以把信息读到类似集合的DataView再去绑定,虽然多转了一步,但也算是勉强支持绑定了。

再说MDataTable

MDataTable是CYQ.Data 数据层框架里极重要的一组类,实现了和数据库间的完整映射,同时也肩负着和各种UI打交道,当然了,没有它我也不可能去研究各种绑定了。

对于自定义MDataTable数据源,在绑定列表控件的这条路上,几年前我研究了很久,后来最稳定的实现为:
public class MDataTable : IDataReader, IEnumerable,IListSource

为何MDataTable在WPF下和DataTable一样失效了?

这里其实有一个和DataTable不同的东西,就是我的自定义数据源继承了IDataReader和IEnumerable,简单的说是支持WPF的。

但是结果为啥绑定无效? 

经过代码调试,发现了原来是接口的优先级问题热的祸, IListSource的级别比IEnumerable的先被调用了,结果就走了类似DataTable那一套规则,但那一套规则的属性读取和WPF是无效的,结果就变成了属性绑定,而不是数据行绑定。

解决的办法:

由于IListSource的存在,会导致WPF无法正常绑定,那就把这接口去掉了,发现WPF就正常了。
但是问题又来了,Winform是靠IListSource接口才能绑定,去掉了IListSource,在winform下不正常了。
经过一番深思,考虑了DataTable依靠DataTableView的方式来绑定WPF,我亮出了一招:

说明:

把IListSource接口的实现,分到了另一个类 MDataTableView,注意修饰为内部类,说明对于使用者来说,一切是还是照旧,但是内部在MDataTable.Bind方法调用是有识别当前的平台,如果是Winform,则把对象变更为:new MDataTableView(ref sourceObje)

总结:

虽然各位平时和这些列表控件相依为命,但估计研究绑定机制的,还是比较少的,毕竟需要一定的缘分。

今天的内容就当个参考,待某天缘分来的时候,有需要的时候,再来回顾我这篇文章亦可。 

.NET各大平台数据列表控件绑定原理及比较(WebForm、Winform、WPF)的更多相关文章

  1. UWP开发必备:常用数据列表控件汇总比较

    今天是想通过实例将UWP开发常用的数据列表做汇总比较,作为以后项目开发参考.UWP开发必备知识点总结请参照[UWP开发必备以及常用知识点总结]. 本次主要讨论以下控件: GridView:用于显示数据 ...

  2. CYQ.Data 支持WPF相关的数据控件绑定.Net获取iis版本

    CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09) 事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便 ...

  3. MFC可视化 列表控件的使用

    1.应该加入头文件   #include <Atlbase.h>   2.示例     类向导给列表控件绑定变量m_list DWORD   dwExStyle=LVS_EX_FULLRO ...

  4. CYQ.Data 支持WPF相关的数据控件绑定(2013-08-09)

    事件的结果 经过多天的思考及忙碌的开发及测试,CYQ.Data 终于在UI上全面支持WPF,至此,CYQ.Data 已经可以方便支持wpf的开发,同时,框架仍保留最低.net framework2.0 ...

  5. Atitit. BigConfirmTips 控件 大数据量提示确认控件的原理and总结O9

    Atitit. BigConfirmTips 控件 大数据量提示确认控件的原理and总结O9 1. 主要的涉及的技术 1 2. 主要的流程 1 3. 调用法new confirmO9t(); 1 4. ...

  6. WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: Dat ...

  7. VC++ 列表控件的使用方法

    列表控件可以看作是功能增强的ListBox,它提供了四种风格,而且可以同时显示一列的多中属性值.MFC中使用CListCtrl类来封装列表控件的各种操作. 通过调用BOOL Create( DWORD ...

  8. SNF开发平台WinForm-Grid表格控件大全

    我们在开发系统时,会有很多种控件进行展示,甚至有一些为了方便的一些特殊需求. 那么下面就介绍一些我们在表格控件里常用的方便的控件:   1.Grid表格查询条 Grid表格下拉 3.Grid表格弹框选 ...

  9. SNF快速开发平台MVC-富文本控件集成了百度开源项目editor

    一.效果如下: 二.在框架当中调用代码如下: 1.在js里配置如下: <script type="text/javascript"> var viewModel =fu ...

随机推荐

  1. maven权威指南学习笔记(四)—— maven生命周期(lifecycle)

    定义: 生命周期是包含在一个项目构建中的一系列有序的阶段 举个例子来说就是maven 对一个工程进行: 验证(validate) -- 编译源码(compile) -- 编译测试源码(test-com ...

  2. maven权威指南学习笔记(一)——简介

    maven是什么?有什么用? Maven是一个项目管理工具,它包含了     一个项目对象模型 (Project Object Model),     一组标准集合,     一个项目生命周期(Pro ...

  3. Arduino uno 教程~持续更新~

    http://arduino.osall.com/index.html http://study.163.com/search.htm?t=2&p=Arduino http://www.ard ...

  4. Http、Https请求工具类

    最近在做微信开发,使用http调用第三方服务API,有些是需要https协议,通过资料和自己编码,写了个支持http和https的工具类,经验证可用,现贴出来保留,也供需要的人使用(有不足的地方,也请 ...

  5. CSS中的rem的换算

    rem好像也是一个相对大小的值,它是相对于根元素<html>,比如假设,我们设置html的字体大小的值为 html{font-size: 87.5%;}(也就是14px,这是twentyt ...

  6. c语言结构体

    [C语言]21-结构体 本文目录 一.什么是结构体 二.结构体的定义 三.结构体变量的定义 四.结构体的注意点 五.结构体的初始化 六.结构体的使用 七.结构体数组 八.结构体作为函数参数 九.指向结 ...

  7. bzoj3673可持久化线段树实现可持久化数组实现可持久化并查集(好长)

    线段树只用叶子节点感觉莫名浪费,,, 感觉真好写(刚从未来程序逃回来的人) #include <cstdio> #define mid ((l+r)>>1) ,ca,x,y; ...

  8. tessnet2.Tesseract Init程序退出问题解决

    1.检查语言包与引用库版本是否一致.2.0需要使用2.0的语言包.(http://www.pixel-technology.com/freeware/tessnet2/) 2.是否安装过3.0,安装中 ...

  9. C++:为什么说 goto 没有用

    要了解一个功能有没有用,首先应该分析它能实现的所有功能. goto 可以实现的功能只有两种:一,向前面跳:二,向后面跳.这两种情况对应三种功能:一,重复执行也就是循环:二,跳过一段代码也就是条件判断: ...

  10. 常用的js正则表达式

    正则表达式,一个十分古老而又强大的文本处理工具,仅仅用一段非常简短的表达式语句,便能够快速实现一个非常复杂的业务逻辑.熟练地掌握正则表达式的话,能够使你的开发效率得到极大的提升. 下面是一些,在前端开 ...