为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
产品

本章起,将续章讲解整框架当初的设计思路:

本章既为续章,说明我以前写过,是的,以前我写过内部整个MDataTable的构造,不过,当初匆匆写完后,

最后一步的实现MDataTable绑定GridView/DataList/Repeater还差一点,这章续上!

这里列出我以前写过的关于构造自定义MDataTable系列文章:

备注:以下内容为早期所写,文字少,代码多,有不明之处,欢迎在文章后面留言!

 

1:CYQ.Data 轻量数据访问层(二) 构造数据单元(上)

2:CYQ.Data 轻量数据访问层(三) 构造数据单元(下)

3:CYQ.Data 轻量数据访问层(四) 构造数据单元列

4:CYQ.Data 轻量数据访问层(五) 构造数据行

5:CYQ.Data 轻量数据访问层(六) 构造数据表

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

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

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

 

在写完第八篇(九)之后,我们的测试结果里,并没有完成绑定功能,我们来看一下测试代码:

复制代码

            MDataTable table=new MDataTable("myTableName");
            table.Columns.Add("Url", SqlDbType.NVarChar);
            table.Columns.Add("Name",SqlDbType.NVarChar);

            MDataRow mdr = table.NewRow();
            mdr[0].Value = "http://cyq1162.cnblogs.com/";
            mdr[1].Value = "路过秋天";
            table.Rows.Add(mdr);
            GridView1.DataSource = table;
            GridView1.DataBind();复制代码

 

我们像普通的DataTable一样,添加了两列,然后对列赋值:

我们看一下测试的结果:

很明显,绑定的结果乱七杂八,不是我们想要的。 

 

经过代码对比,发现,我们的MDataRow得实现IDataRecord接口才行,于是,让IDataRecord继承接口,并实现:

复制代码

public class MDataRow : List<MDataCell>, IDataRecord
    {
       /// ...省略N行已有代码...

        #region IDataRecord 成员

        int IDataRecord.FieldCount
        {
            get
            {
                return base.Count;
            }
        }

        bool IDataRecord.GetBoolean(int i)
        {
            return (bool)this[i].Value;
        }

        byte IDataRecord.GetByte(int i)
        {
            return (byte)this[i].Value;
        }

        long IDataRecord.GetBytes(int i, long fieldOffset, byte[] buffer, int bufferoffset, int length)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        char IDataRecord.GetChar(int i)
        {
            return (char)this[i].Value;
        }

        long IDataRecord.GetChars(int i, long fieldoffset, char[] buffer, int bufferoffset, int length)
        {
            return (long)this[i].Value;
        }

        IDataReader IDataRecord.GetData(int i)
        {
            throw new Exception("The method or operation is not implemented.");
        }

        string IDataRecord.GetDataTypeName(int i)
        {
            return (string)this[i].Value;
        }

        DateTime IDataRecord.GetDateTime(int i)
        {
            return (DateTime)this[i].Value;
        }

        decimal IDataRecord.GetDecimal(int i)
        {
            return (decimal)this[i].Value;
        }

        double IDataRecord.GetDouble(int i)
        {
            return (double)this[i].Value;
        }

        Type IDataRecord.GetFieldType(int i)
        {
            return this[i].Value.GetType();
        }

        float IDataRecord.GetFloat(int i)
        {
            return (float)this[i].Value;
        }

        Guid IDataRecord.GetGuid(int i)
        {
            return (Guid)this[i].Value;
        }

        short IDataRecord.GetInt16(int i)
        {
            return (short)this[i].Value;
        }

        int IDataRecord.GetInt32(int i)
        {
            return (int)this[i].Value;
        }

        long IDataRecord.GetInt64(int i)
        {
            return (long)this[i].Value;
        }

        string IDataRecord.GetName(int i)
        {
            return (string)this[i].Value;
        }

        int IDataRecord.GetOrdinal(string name)
        {
            return (int)this[name].Value;
        }

        string IDataRecord.GetString(int i)
        {
            return (string)this[i].Value;
        }

        object IDataRecord.GetValue(int i)
        {
            return this[i].Value;
        }

        int IDataRecord.GetValues(object[] values)
        {
            return 0;
        }

        bool IDataRecord.IsDBNull(int i)
        {
            return this[i].Value == DBNull.Value;
        }

        object IDataRecord.this[string name]
        {

            get
            {
                return this[name].Value;
            }
        }

        object IDataRecord.this[int i]
        {
            get
            {
                return this[i].Value;
            }
        }

        #endregion
    }复制代码

 

接着浏览了一下,不见啥效果。

 

于是又对比了一下代码,发现原来的MDataTable是采用继承方式List<MDataRow>,

于是,把它给弄到下面来了:

复制代码

 public class MDataTable : IDataReader, IEnumerable
    {
        private List<MDataRow> _Mdr;
        public List<MDataRow> Rows
        {
            get
            {
                return _Mdr;
            }
        }
     //...下面省略N行...
}复制代码

 

 

接着小调整了一下,再次浏览,终于效果出来了:

 

 

 

至此,整个框架三部分中自定义MDataTable系列,就到此结束了。

 

 

备注:完整框架源码会在本系列结束之后另开章节发布,暂时望勿激动,学习思想才是重要的。

如果在学习过程中发现有什么问题,欢迎留言!

 

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
移动开发工程师
手记
粉丝
64
获赞与收藏
367

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消