DataTable 深入解析数据源绑定原理之高级篇

本文深入探讨了DataTable在Winform和Web中作为数据源的绑定原理,通过Reflector分析了DataTable的IListSource接口实现。解释了如何通过实现ICustomTypeDescriptor接口来支持数据列名和值的识别,并提供了MDataTable模仿实现Winform下DataGridView支持的步骤。
摘要由CSDN通过智能技术生成
前言

 

在上篇写了篇 实战系列之天气预报实时采集 ,有个别同志认为没技术含量,也许正如所说。

只是人各有看法,当我写出一篇文章时,我只是希望:

1:如果你还不懂,请看写法,了解想法

2:如果你已懂,略过写法,请看想法

 

其实纵观我一直写来的200多篇文章,基本都可以看出那么点痕迹:

一:没有水文

二:没有华丽理论型的文章

三:实战型文章很多

四:文章尽量面向新手的表述,尽量了

 

今天写篇,还是试图从简入手,希望新手也能有收获,有有没“技术含量”,大伙看着说了~~~要是看不懂,你就点下推荐~

 

以下为正文

 

一:Winform下的DataGridView不支持使用DataReader绑定

1:问题产生

在 CYQ.Data 框架 进行到V1.5版本要支持Winform时,曾遇到一个问题,就是无法绑定DataGridView。

 

2:思考分析试验

MDataTable走的是DataReader方式实现的绑定,除非DataReader无法绑定DataGridView,不然就是自己实现有问题。

因此,做个试验:使用SqlDataReader直接绑定Winform下的DataGridView,发现失败了。

于是大量搜索,发现DataReader实在无法直接绑定DataGridView,通过数据源控件中转绑定的就算了。

 

3:得出结论

DataReader方式都无法绑定Winform下的DataGridView,我这继承之DataReader的实现方式也就更无从实现绑定了。

只好另寻方法-》DataGridView支持DataTable,于是要从DataTable入手了。

 

二:DataTable很强大,支持Web又支持Winform

 

1:分析绑定原理

在以前的MDataTable实现绑定原理篇中,我们研究出要实现绑定,有两种方式:

一种是实现IEnumerable接口,即当初走的DataReader方式实现的绑定。

另一种是实现IListSource接口,即走DataTable方式实现的绑定。

为啥当初不实现DataTable方式的绑定,不就完了,两种都支持~~-_-..现在又得回去折腾IListSource接口的实现

 

2:深入DataTable绑定原理

我们通过Reflector反编绎看下DataTable继承实现的接口:

public   class  DataTable : MarshalByValueComponent, IListSource, ISupportInitializeNotification, ISupportInitialize, ISerializable, IXmlSerializable

几乎都是我们平常没用到的接口,不理先,我们关注IListSource怎么实现绑定的。

如果自己看一下IListSource要实现的接口有几个方法:

public   interface  IListSource
{
    
//  Methods
    IList GetList();
    
//  Properties
     bool  ContainsListCollection {  get ; }
}

就两个,太容易了,接着我们要在DataTable 6000多行的代码中找到IListSource的实现,查找是最好的方法:

// DataTable的实现
bool  IListSource.ContainsListCollection
{
    
get  {   return   false ; }
}

IList IListSource.GetList()
{
    
return   this .DefaultView;
}

GetList接口没事就返回了个默认视图,又要切进去看视图了。

public  DataView DefaultView
{
    
get
    {
        DataView defaultView 
=   this .defaultView;
        
if  (defaultView  ==   null )
        {
            
if  ( this .dataSet  !=   null )
            {
                defaultView 
=   this .dataSet.DefaultViewManager.CreateDataView( this );
            }
            
else
            {
                defaultView 
=   new  DataView(
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值