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