繼上一節之後,我們開始尋找綁定之法
先是一回想,我們平常是拿什麼綁定到資料控件的:list<實體類>,datatable,dataset,dataview之類的,
而寫法也就這麼個樣:
xxxx.datasource=list<實體類>....等
xxxx.databind();
于是,我們就從這些東西入手了,要不然也措不着頭腦該往哪兒找
datasource這東西要給指派,那我們打開reflector.exe看看這裡面究竟有點什麼東西先
按下f3,搜尋repeater,當然也可以搜其它象gridview之類的其它控件,反正搜有datasource這東西的就行了
ok,定位repeater之後,展開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();
來吧,給我盡情的報錯吧,運作。。。。。
刷。。出來了這麼點東西:
item
h
e
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()方法,
終于發現眼前一片光明,抄到小路了...
下節繼續....
版權聲明:本文原創發表于部落格園,作者為路過秋天,原文連結:http://www.cnblogs.com/cyq1162/archive/2009/11/10/1599623.html