天天看點

CYQ.Data 輕量資料通路層(八) 自定義資料表實作綁定常用的資料控件(中)

繼上一節之後,我們開始尋找綁定之法

先是一回想,我們平常是拿什麼綁定到資料控件的:list<實體類>,datatable,dataset,dataview之類的,

而寫法也就這麼個樣:

xxxx.datasource=list<實體類>....等

xxxx.databind();

于是,我們就從這些東西入手了,要不然也措不着頭腦該往哪兒找

datasource這東西要給指派,那我們打開reflector.exe看看這裡面究竟有點什麼東西先

按下f3,搜尋repeater,當然也可以搜其它象gridview之類的其它控件,反正搜有datasource這東西的就行了

ok,定位repeater之後,展開datasource屬性,看源碼如下:

CYQ.Data 輕量資料通路層(八) 自定義資料表實作綁定常用的資料控件(中)

[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這東西:

CYQ.Data 輕量資料通路層(八) 自定義資料表實作綁定常用的資料控件(中)

public interface ilistsource

    // methods

    ilist getlist();

    // properties

    bool containslistcollection { get; }

CYQ.Data 輕量資料通路層(八) 自定義資料表實作綁定常用的資料控件(中)

哦,原來這接口就是傳回一個ilist,那我們的自定義的mdatatable好像也有list接口了,怪不得直接綁定,

卻綁定了一個些類的實體屬性,看來猜想有可能和那些list<實體類>一類的就綁定都差不多了.

既然我們是簡化的模仿datatable,那就從datatable找起好了,還是用reflector,exe搜尋datatable并定位,

驚人發現,datatable竟然繼承了ilistsource接口,那它不是和我的一個樣,咋它就能綁定就正常,我的就不能。

太陽一個。。

打開實作的getlist()方法一看,轉了一圈,傳回了一個dataview,

再打開dataview,發現原來還是繼承了ienumerable

唉,不折騰了,直接就上馬ienumerable好了:

public interface ienumerable

    [dispid(-4)]

    ienumerator getenumerator();

先把接口繼承了,要實作接口方法了,暈,不會寫,總不能寫個抛異常吧。。。。

又一閃,既然dataview實作那個接口,看看人家怎麼實作,照着模仿一下應該就差不多了吧:

CYQ.Data 輕量資料通路層(八) 自定義資料表實作綁定常用的資料控件(中)

public ienumerator getenumerator()

    datarowview[] array = new datarowview[this.rowviewcache.count];

    this.rowviewcache.copyto(array, 0);

    return array.getenumerator();

CYQ.Data 輕量資料通路層(八) 自定義資料表實作綁定常用的資料控件(中)

oh,竟然原來是搞了一份行數組,又來copy一下,之後傳回調用數組的getenumerator()方法,

終于發現眼前一片光明,抄到小路了...

下節繼續....

版權聲明:本文原創發表于部落格園,作者為路過秋天,原文連結:http://www.cnblogs.com/cyq1162/archive/2009/11/10/1599623.html