可指定给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
[ThemeableAttribute(
false
)]
2
[BindableAttribute(
true
)]
3
public
virtual
Object DataSource
{ get; set; }
竟然只有一个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, 章立民 着, 碁峰出版社