博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
(原創) 为什么GridView的DataSource可指定DataTable,亦可指定DataTable的DefaultView? (高级) (.NET) (ADO.NET)...
阅读量:6172 次
发布时间:2019-06-21

本文共 1359 字,大约阅读时间需要 4 分钟。

可指定给DataSource的object很广,有ArrayList,Collection,DataSet,DataTable,DataView,还有DataReader,甚至你自己写的Class也可以,为什么DataSource能接受这么广泛的对象呢?以前在用时,也从来没有注意过,网友momo问我这个问题后,才发现这是一个好问题。
我第一个推论是,DataTable的DefaultProperty就是DefaultView,所以当你指定DataTable给GridView.DataSource时,compiler会自动将该DataTable的DefaultView给GridView.DataSource。DefaultProperty是VB6的观念,VB6大量使用DefaultProperty,但我又问自己,C#该怎么写DefaultProperty呢?我自己也楞住了,C#似乎没有DefaultPropety的概念,所以应该不是DefaultProperty。
我的第二个推论是,DataSource应该是用overload写的,但查了MSDN Library,发现DataSource的signature是
1
None.gif
[ThemeableAttribute(
false
)] 
2
None.gif[BindableAttribute(
true
)] 
3
ExpandedBlockStart.gifContractedBlock.gif
public
 
virtual
 Object DataSource 
dot.gif
getset; }
竟然只有一个Object型别,所以overload的推论也错了。
我的第三个推论是,要不然就都必须时作一个interface才行,结果我在
章立民
用实例学ASP.NET 使用VB.NET与ADO.NET的P6-33页找到,只要任何支持IEnmerable interface的object,都可指定给DataSource,如此问题总算找到答案了。
我用MSDN Library去查IEnumerable,他只有一个GetEnumerator这个method,也就是说,当GridView.DataBind()时,他会从GrirView.DataSource所指定的object中去呼叫GetEnumerator()去抓数据,无论你是任何object,只要都有GetEnumerator()即可,DataTable和DataView因为都实做了IEnumerable,所以都有GetEnumerator(),所以都可以指定给DataSource。
所以在回到问题的源头,GridView.DataSource = ds.Tables[0]; 和 GridView.DataSource = ds.Tables[0].DefaultView; 写法既然都可以,该用哪一个呢?
我觉得直接写ds.Tables[0]的速度较快,而ds.Tables[0].DefaultView还要再产生DataView object,不过这也只是推论而已,我觉得要实际看一下所产生的MSIL code才能证实,等我今天写完作业后,我再来看一下他所产生的MSIL code.
Reference
用实例学ASP.NET 使用VB.NET与ADO.NET P6-33, 章立民 着, 碁峰出版社
你可能感兴趣的文章
《Metasploit渗透测试手册》—第1章1.10节分析数据库中存储的渗透测试结果
查看>>
《Adobe Acrobat XI经典教程》—第2课减小文件大小
查看>>
《数据库技术原理与应用教程》一第2章 数据库的基础知识
查看>>
QuaggaJS —— 纯 JavaScript 开发的条形码扫描
查看>>
在图片中加入噪点就能骗过 Google 最顶尖的图像识别 AI
查看>>
免费下载!业界首部安卓热修复宝典出炉,阿里技术大牛联袂推荐
查看>>
OpenID 关联认证提供 CoreOS dex
查看>>
《Node.js区块链开发》一2.2 信用,决定着利益转移的方向
查看>>
Speedy:来自京东的 Docker 镜像存储系统
查看>>
《动手玩转Arduino》——11.2 众多的Arduino板
查看>>
IBM Watson 进入癌症基因组分析市场
查看>>
在 Linux 中查看你的时区
查看>>
Linux集群和自动化维1.6 小结
查看>>
《OpenACC并行编程实战》—— 第1章 并行编程概览 1.1 加速器产品
查看>>
C语言OJ项目参考(2417) 字符串长度
查看>>
ajax的手写、封装和自定义设置
查看>>
class path resource [META-INF/xfire/services.xml] cannot be opened because it does not exist
查看>>
android自定义属性
查看>>
ERROR 1114 (HY000): The table 'table1' is full
查看>>
知乎网友神回复:哪怕是平时聊天吹牛的也没见程序员晒,这是为什么呢?
查看>>