前言
在上篇写了篇 实战系列之天气预报实时采集 ,有个别同志认为没技术含量,也许正如所说。
只是人各有看法,当我写出一篇文章时,我只是希望:
1:如果你还不懂,请看写法,了解想法
2:如果你已懂,略过写法,请看想法
1:如果你还不懂,请看写法,了解想法
2:如果你已懂,略过写法,请看想法
其实纵观我一直写来的200多篇文章,基本都可以看出那么点痕迹:
一:没有水文
二:没有华丽理论型的文章
三:实战型文章很多
四:文章尽量面向新手的表述,尽量了
二:没有华丽理论型的文章
三:实战型文章很多
四:文章尽量面向新手的表述,尽量了
今天写篇,还是试图从简入手,希望新手也能有收获,有有没“技术含量”,大伙看着说了~~~要是看不懂,你就点下推荐~
以下为正文
一:Winform下的DataGridView不支持使用DataReader绑定
1:问题产生
在 CYQ.Data 框架 进行到V1.5版本要支持Winform时,曾遇到一个问题,就是无法绑定DataGridView。
2:思考分析试验
MDataTable走的是DataReader方式实现的绑定,除非DataReader无法绑定DataGridView,不然就是自己实现有问题。
因此,做个试验:使用SqlDataReader直接绑定Winform下的DataGridView,发现失败了。
于是大量搜索,发现DataReader实在无法直接绑定DataGridView,通过数据源控件中转绑定的就算了。
因此,做个试验:使用SqlDataReader直接绑定Winform下的DataGridView,发现失败了。
于是大量搜索,发现DataReader实在无法直接绑定DataGridView,通过数据源控件中转绑定的就算了。
3:得出结论
DataReader方式都无法绑定Winform下的DataGridView,我这继承之DataReader的实现方式也就更无从实现绑定了。
只好另寻方法-》DataGridView支持DataTable,于是要从DataTable入手了。
只好另寻方法-》DataGridView支持DataTable,于是要从DataTable入手了。
二:DataTable很强大,支持Web又支持Winform
1:分析绑定原理
在以前的MDataTable实现绑定原理篇中,我们研究出要实现绑定,有两种方式:
一种是实现IEnumerable接口,即当初走的DataReader方式实现的绑定。
另一种是实现IListSource接口,即走DataTable方式实现的绑定。
为啥当初不实现DataTable方式的绑定,不就完了,两种都支持~~-_-..现在又得回去折腾IListSource接口的实现
一种是实现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 ; }
}
{
// Methods
IList GetList();
// Properties
bool ContainsListCollection { get ; }
}
就两个,太容易了,接着我们要在DataTable 6000多行的代码中找到IListSource的实现,查找是最好的方法:
//
DataTable的实现
bool IListSource.ContainsListCollection
{
get { return false ; }
bool IListSource.ContainsListCollection
{
get { return false ; }
}
IList IListSource.GetList()
{
return this .DefaultView;
}
IList IListSource.GetList()
{
return this .DefaultView;
}
GetList接口没事就返回了个默认视图,又要切进去看视图了。
![](https://i-blog.csdnimg.cn/blog_migrate/81178cc93a2a3bb5048d90d76e7ec935.gif)
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(
{
get
{
DataView defaultView = this .defaultView;
if (defaultView == null )
{
if ( this .dataSet != null )
{
defaultView = this .dataSet.DefaultViewManager.CreateDataView( this );
}
else
{
defaultView = new DataView(