本章起,将续章讲解整框架当初的设计思路:
本章既为续章,说明我以前写过,是的,以前我写过内部整个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系列,就到此结束了。
备注:完整框架源码会在本系列结束之后另开章节发布,暂时望勿激动,学习思想才是重要的。
如果在学习过程中发现有什么问题,欢迎留言!
版权声明:本文原创发表于博客园,作者为路过秋天,原文链接:
http://www.cnblogs.com/cyq1162/archive/2010/08/24/1806300.html
相关资源:敏捷开发V1.0.pptx