zoukankan      html  css  js  c++  java
  • CYQ.Data 轻量数据访问层(八) 自定义数据表实现绑定常用的数据控件(中)

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

    先是一回想,我们平常是拿什么绑定到数据控件的:List<实体类>,DataTable,DataSet,DataView之类的,

    而写法也就这么个样:

    xxxx.DataSource=List<实体类>....等

    XXxx.DataBind();

    于是,我们就从这些东西入手了,要不然也措不着头脑该往哪儿找

    DataSource这东西要给赋值,那我们打开reflector.exe看看这里面究竟有点什么东西先

    按下F3,搜索Repeater,当然也可以搜其它象GridView之类的其它控件,反正搜有DataSource这东西的就行了

    OK,定位Repeater之后,展开DataSource属性,看源码如下:

    DataSource

    哟,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()方法,

    终于发现眼前一片光明,抄到小路了...

    下节继续....

    版权声明:本文原创发表于 博客园,作者为 路过秋天 本文欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则视为侵权。
    个人微信公众号
    创业QQ群:617713515
    Donation(扫码支持作者):支付宝:
    Donation(扫码支持作者):微信:
  • 相关阅读:
    【Python编程:从入门到实践】chapter6 字典
    【Python编程:从入门到实践】chapter5 if语句
    【Linux_Unix系统编程】Chapter9 进程凭证
    【Linux_Unix系统编程】Chapter10 时间
    【Linux_Unix系统编程】Chapter8 用户和组
    【Linux_Unix系统编程】chapter7 内存分配
    【Linux_Unix系统编程】chapter6 进程
    书籍 人生
    流程图软件
    技术文章,iOS,iOS开发系列 数学函数
  • 原文地址:https://www.cnblogs.com/cyq1162/p/1599623.html
Copyright © 2011-2022 走看看