CYQ.Data 轻量数据访问层(八) 自定义数据表实现绑定常用的数据控件(中)
2019獨角獸企業重金招聘Python工程師標準>>>
繼上一節之后,我們開始尋找綁定之法
先是一回想,我們平常是拿什么綁定到數據控件的:List<實體類>,DataTable,DataSet,DataView之類的,
而寫法也就這么個樣:
xxxx.DataSource=List<實體類>....等
XXxx.DataBind();
于是,我們就從這些東西入手了,要不然也措不著頭腦該往哪兒找
DataSource這東西要給賦值,那我們打開reflector.exe看看這里面究竟有點什么東西先
按下F3,搜索Repeater,當然也可以搜其它象GridView之類的其它控件,反正搜有DataSource這東西的就行了
OK,定位Repeater之后,展開DataSource屬性,看源碼如下:
DataSource[Bindable(true),?WebSysDescription("BaseDataBoundControl_DataSource"),?WebCategory("Data"),?DefaultValue((string)?null),?DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public?virtual?object?DataSource
{
????get
????{
????????return?this.dataSource;
????}
????set
????{
????????if?(((value?!=?null)?&&?!(value?is?IListSource))?&&?!(value?is?IEnumerable))
????????{
????????????throw?new?ArgumentException(SR.GetString("Invalid_DataSource_Type",?new?object[]?{?this.ID?}));
????????}
????????this.dataSource?=?value;
????????this.OnDataPropertyChanged();
????}
}
?
喲,yoyo~~value is IListSource 或者value is IEnumerable,如果不是這兩種類型,還拋異常
突然記起來,以前也拋過異常的,還是中文的,突然想看看這個異常的中文版是啥樣的
于是,隨便找了一個頁面,拉了一個GridView進去,后臺寫上這么幾行代碼:
object ?value = " hello " ;GridView1.DataSource? = ?value;
GridView1.DataBind();
來吧,給我盡情的報錯吧,運行。。。。。
刷。。出來了這么點東西:
| h |
| e |
| l |
| l |
| o |
太陽,這么牛B,還給拆成字符給我列表下來了,從reflector.exe搜索object,發現沒繼承自IListSource 或IEnumerable。
太陽,把object value="hello",改成object value=1,一試,運行,刷,期待的中文黃色異常竟然終于來了
"數據源的類型無效。它必須是 IListSource、IEnumerable 或 IDataSource。"
不截圖了,麻煩。直接加黃色好了。突然腦子一閃,從reflector.exe搜索String,
發現竟然String還真的繼承了IEnumerable這東西。唉。。。
于上問題開始白熱化了,焦點就在IListSource和IEnumerable上了,只要讓我們的自定義MDataTable實現其中之一的接口,就萬事大吉了。
先用reflector.exe看一下IListSource這東西:
public ? interface ?IListSource{
???? // ?Methods
????IList?GetList();
???? // ?Properties
???? bool ?ContainsListCollection?{? get ;?}
}
哦,原來這接口就是返回一個IList,那我們的自定義的MDataTable好像也有List接口了,怪不得直接綁定,
卻綁定了一個些類的實體屬性,看來猜想有可能和那些List<實體類>一類的就綁定都差不多了.
既然我們是簡化的模仿DataTable,那就從DataTable找起好了,還是用reflector,exe搜索DataTable并定位,
驚人發現,DataTable竟然繼承了IListSource接口,那它不是和我的一個樣,咋它就能綁定就正常,我的就不能。
太陽一個。。
打開實現的GetList()方法一看,轉了一圈,返回了一個DataView,
再打開DataView,發現原來還是繼承了IEnumerable
唉,不折騰了,直接就上馬IEnumerable好了:
public ? interface ?IEnumerable{
????[DispId( - 4 )]
????IEnumerator?GetEnumerator();
}
先把接口繼承了,要實現接口方法了,暈,不會寫,總不能寫個拋異常吧。。。。
?
又一閃,既然DataView實現那個接口,看看人家怎么實現,照著模仿一下應該就差不多了吧:
public ?IEnumerator?GetEnumerator(){
????DataRowView[]?array? = ? new ?DataRowView[ this .RowViewCache.Count];
???? this .RowViewCache.CopyTo(array,? 0 );
???? return ?array.GetEnumerator();
}
?
oh,竟然原來是搞了一份行數組,又來copy一下,之后返回調用數組的GetEnumerator()方法,
終于發現眼前一片光明,抄到小路了...
下節繼續....
轉載于:https://my.oschina.net/secyaher/blog/274326
總結
以上是生活随笔為你收集整理的CYQ.Data 轻量数据访问层(八) 自定义数据表实现绑定常用的数据控件(中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 春苗网知识竞赛答题2018答案 春苗网知
- 下一篇: 怎么查询oracle有哪些用户