CYQ.Data 数据层框架CYQ.Data 是一款由路过秋天创作的支持多数据库应用[Txt,Xml,Access,MSSQL,Oracle,SQLite,MySql]的底层数据库操作类库,使用本类库可以轻松快速开发项目(QQ群:6033006)。 |
MDataTable 原理解析 数据控件绑定-中篇
框架原理 |
|
|
| #楼主 | ||||||
继上一节之后,我们开始寻找绑定之法 先是一回想,我们平常是拿什么绑定到数据控件的: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(); 来吧,给我尽情的报错吧,运行。。。。。 刷。。出来了这么点东西:
太阳,这么牛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()方法, 终于发现眼前一片光明,抄到小路了... 下节继续.... |
发表评论
论坛公告
帖子搜索
最新帖子
最新评论
- 请教博主。我mysql的提示 V5.7.7.4 MySql.xxxx:check the tablename "tbl_site_info" is exist? error:ExeDataReader():Expression #1 of ORDER BY clause is not in SELECT list, references column 'information_schema.s1.ORDINAL_POSITION' which is not in SELECT list; this is incompatible with DISTINCT 配置如下: <?xml version="1.0" encoding="utf-8" ?> <configuration> <connectionStrings> <add name="Conn" connectionString="host=192.168.3.101;Port=3306;Database=xxxxx;uid=root;pwd=2017" providerName="MySql.Data.MySqlClient"/> </connectionStrings> </configuration>
- 查询语句有点问题,软件启动时查询语句可以从数据库查询出数据,软件一直运行时无论怎么修改数据库,查询出来的还是老数据,不知道是为什么
- 我语句中用到了union all而且两个查询都有查询条件,action.select总是不成功,不知道有没有什么好的解决办法,谢谢
- 大神,如果我想通过一个对象(从数据映射过来的)要插入的话,我需要遍历字段然后每个set一下吗?有没有更好的方法??
- 真心好用,想问下秋天直接拼写sql怕注入吗
- V4.5后,好多方法都改变了,求来个新的日志帮助
- 請問大神V5源碼要多少錢 我是和交流過的
- 楼主,,从数据库里查出来并绑定datagridview,但是显示的都是数据库里的英文名,怎么改??好纠结啊这个。。。。
- 我想问一下,主从表添加怎样处理
- 10年就过了!!!!