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

简介:

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

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

而写法也就这么个样:

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

XXxx.DataBind();

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

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

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

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

ExpandedBlockStart.gif
[Bindable(true), WebSysDescription("BaseDataBoundControl_DataSource"), WebCategory("Data"), DefaultValue((stringnull), 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

相关实践学习
基于Hologres轻松玩转一站式实时仓库
本场景介绍如何利用阿里云MaxCompute、实时计算Flink和交互式分析服务Hologres开发离线、实时数据融合分析的数据大屏应用。
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
目录
相关文章