日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CYQ.Data 轻量数据访问层(八) 自定义数据表实现绑定常用的数据控件(中)

發布時間:2023/12/15 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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();

來吧,給我盡情的報錯吧,運行。。。。。

刷。。出來了這么點東西:

Item
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 轻量数据访问层(八) 自定义数据表实现绑定常用的数据控件(中)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。