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

继上一节之后,我们开始寻找绑定之法

先是一回想,我们平常是拿什么绑定到数据控件的: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
l
o

太阳,这么牛B,还给拆成字符给我列表下来了,从reflector.exe搜索object,发现没继承自IListSource 或IEnumerable。

太阳,把object value="hello",改成object value=1,一试,运行,刷,期待的中文黄色异常竟然终于来了

"数据源的类型无效。它必须是 IListSource、IEnumerable 或 IDataSource。"

不截图了,麻烦。直接加黄色好了。突然脑子一闪,从reflector.exe搜索String,

发现竟然String还真的继承了IEnumerable这东西。唉。。。

于上问题开始白热化了,焦点就在IListSourceIEnumerable上了,只要让我们的自定义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

时间: 2024-09-02 18:26:21

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

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

还记得当初以为似找到:行数组Copy之后,再array.GetEnumerator();就可行.   实际操作之后,发现不可行,于是,这不可行的路就不写了,避免浪费大伙精力看了. 以下讲可行之路: 通过Reflector找到SqlDataReader类,因为它也是可绑定之一的数据源,虽然直拉绑定往往造成链接未关闭事件. 通过研究:   public class SqlDataReader : DbDataReader, IDataReader, IDisposable, IDataRecord

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

继上一节实现MDataTable之后,我们再为MDataTable加上一个NewRow()方法,以便能构造出该表的新行 如下:  public MDataRow NewRow()        {            MDataRow mdr = new MDataRow();            mdr.TableName = _TableName;            MDataCellStruct mdcStruct = null;            for (int i = 0

CYQ.Data 轻量数据层之路 自定义MDataTable绑定续章(七)

本章起,将续章讲解整框架当初的设计思路: 本章既为续章,说明我以前写过,是的,以前我写过内部整个MDataTable的构造,不过,当初匆匆写完后, 最后一步的实现MDataTable绑定GridView/DataList/Repeater还差一点,这章续上! 这里列出我以前写过的关于构造自定义MDataTable系列文章: 备注:以下内容为早期所写,文字少,代码多,有不明之处,欢迎在文章后面留言!   1:CYQ.Data 轻量数据访问层(二) 构造数据单元(上) 2:CYQ.Data 轻量数据

CYQ.Data 轻量数据层之路 SQLHelper 回头太难(八)

提前说明:正如网友反映的一样,为了不至于产生明显的误导,特别加了此首段说明 SQLHelper,几乎是每个过来者必经的阶段,写好一个SQLHelper是非常重要的一环,所以希望年轻的来者,要多加实践,别只看不动手,哪怕照着写一写,也是相当的有益. 对于本框架系列,希望年轻来者在掌握使用的同时,动手照着系列文章写一写,如果照着写出来的,相信成长不是一点半点的:别光看不练,最后只能忽悠却动不了手.       这篇文章很不好写,我在电脑前思索了一天,也不知怎么下手. 关于SQLHelper的文章遍地

CYQ.Data 轻量数据层之路 使用篇-MProc 存储过程与SQL 视频[最后一集] H (二十八)

说明: 本次录制主要为使用篇:CYQ.Data 轻量数据层之路 使用篇五曲 MProc 存储过程与SQL(十六)   的附加视频教程. 本次视频介绍了MProc对存储过程与SQL语句的操作,由于操作不甚,本节没有音乐了,各位自己放歌听了.   这本次录制的视频上传于-秋色园: 注意如果要看清晰版本,要点击视频下面的:查看原始大小的动画 本次视频大小分辨率为:1024*768,依旧坚持走高清.无码的路线,为观众提供良好视觉享受. 同样:如果直接下载观看时最好设置好宽和高,不然清晰度就没保证了.  

CYQ.Data 轻量数据层之路 抢先体验版本功能说明演示 (二十九)

本系列所有文章索引:CYQ.Data 轻量数据层之路 框架开源系列 索引 本系列所有相关下载:CYQ.Data 轻量数据层之路 bug反馈.优化建议.最新框架下载 前言:   一直都是发布版本才写文章,这次为抢先体验版本[V2.5]做一下简单的功能介绍   以下进行功能更新说明[相比V2.0版本]: 1:修正DebugInfo属性在异常发生时无法取得操作语句的问题 2:MAction增加Bind方法可以轻松绑定DropDownList等控件 3:MDataTable增加ToList<T>泛型方

CYQ.Data 轻量数据层之路 华丽V1.3版本 框架开源

本篇对框架开源进行说明:   提前说明: 1:最近有很多友人没有留言就加群了,导致被拒绝,这此说声抱歉啦.    不过规则还是要遵守的,毕竟人数有限.    如果只是想着可有可无的看,下面有一份反编绎源码,基本也不影响高手查看了. 2:另外也有个别留了言没加群的,也只能说声音抱歉了,源码不会发到指定的邮箱.    源码会发送到指定邮箱的情况:仅限于公司名义,同时站内信有消息,才会特别去发邮件的.       本次开源针对最新版本V1.3版本,相关更新见:CYQ.Data 轻量数据层之路 华丽升级

CYQ.Data 轻量数据层之路 开篇介绍(一)

PS:本系列已太旧,仅供回忆: 项目使用请看V5系列:http://www.cnblogs.com/cyq1162/category/852300.html   近段时间,写: Silverlight+WCF 新手实例 象棋 专题索引 系列,近四十篇的长篇,写到有一种走火入魔的感觉! 虽然四十篇终结时,离:Silverlight+WCF 新手实例 象棋 在线演示 还有一小段距离,不过整体框架与功能都完整的开源讲完了! 为了避免暂时的走火入魔,只好先写写别的系列文章,关于象棋系列后续情况,先暂缓小

CYQ.Data 轻量数据层之路 优雅V1.4 现世 附API帮助文档(九)

继上一版本V1.3版本发布到现在,时隔N天了:[V1.3版本开源见:CYQ.Data 轻量数据层之路 华丽V1.3版本 框架开源]   N天的时间,根据各路网友的反映及自身的想法,继续修改优化着本框架,力求让大伙相对满意: 对于:bug反馈.优化建议.及最新框架版本下载见:CYQ.Data 轻量数据层之路 bug反馈/优化建议/框架下载 升级说明: 本次升级只是针对易用性增加功能或优化代码及方法,并未发现V1.3版本存在任何bug, 因此,对于V1.3版本,大伙可放心使用,同时也已开放源码. 若