none
一个datatable上的多个dataview问题 RRS feed

  • 问题

  • 我在一个project中有一个数据库中的table A.在几个winform都有用到A,但是查询的条件不一样.我想生成一个datatable TA,然后每次从TA创建不同dataview和不同form中的控件绑定。我想问的是,当我关闭form的时候如何关闭dataview?不然每次使用 DataView dv=new DataView(TA);
    产生一个dataview,那么如果没有清除,那会有太多的dataview了。
    另外一个问题就是当我datatable TA更新数据时,所有建立在TA上的dataview会不会自动刷新?如果手动刷新,那么怎么知道有一个dataview?

    还有一个问题:
    我用DataView view=new DataView(datatablename) 创建了一个dataview,然后绑定
    DataView view=new DataView(datatablenameA);
    datagridview1.datasoruce=view;
    view=new DataView(datatablenameB);
    datagridview2.datasoruce=view;

    以上代码是可以运行的,datagridview2绑定到由datatablenameB创建的视图,并不影响到datagirdview1绑定的由datatablenameA创建的视图。我认为语句datagridview1.datasoruce=view;运行后,datagridview1已经绑定到视图上,因此view再次赋值不影响datagridiew1的数据。因此就存在这样一个问题:我不知道由语句DataView view=new DataView(datatablenameA);创建的视图能够存活多久?因为它已经和变量无关了,如果我在另外一个form中也调用了由datatablenameA创建的视图,这使得我无法对datatable上的视图全部清除,因此我如何清除由datatablename1生成的视图view?谢谢!

    ludavid
    2009年4月20日 19:15

答案

  • 1 首先 dataview 本身不包含数据  也不包含敏感资源  他是一个带过滤的枚举器   你要了解这一点的话  就不会觉得他占资源  也不会觉得他浪费
    2 要了解垃圾回收机制 当你对一个dataview 的引用变成0的时候  这个对象已经进入了垃圾回收队列  所以你不需要显示的释放他
    3 datatable TA更新数据时,所有建立在TA上的dataview会不会自动刷新?参考第一点  理应刷新
    4 还有一个问题的答案:  只要你的datagridview1.datasoruce不设置为null  或者  datagridview1 没被回收    第一次的   DataView(datatablenameA)  会一直存在




    兄弟你对dataview 问题不大    但是你对整个clr对象生存期很不了解哦

    可以找一下  clr  GC 的资料
    工作突然有点忙 嘿嘿
    2009年4月21日 2:04

全部回复

  • 我发现上面问题应该是和下面这个相同:

    绑定datasource后,数据源发生变化,为什么没有影响?
    比如:
    datatable db;
    datagridview1.datasource=db;

    db=null;

    但是datagridview1还是显示原来的数据,而不是空。为什么?
    当然重新绑定是可以的。我想是不是datagridview1.datasource在赋值后,他的数据就单独出来,只有重新绑定才会刷新?

    ludavid
    2009年4月20日 19:40
  • 1 首先 dataview 本身不包含数据  也不包含敏感资源  他是一个带过滤的枚举器   你要了解这一点的话  就不会觉得他占资源  也不会觉得他浪费
    2 要了解垃圾回收机制 当你对一个dataview 的引用变成0的时候  这个对象已经进入了垃圾回收队列  所以你不需要显示的释放他
    3 datatable TA更新数据时,所有建立在TA上的dataview会不会自动刷新?参考第一点  理应刷新
    4 还有一个问题的答案:  只要你的datagridview1.datasoruce不设置为null  或者  datagridview1 没被回收    第一次的   DataView(datatablenameA)  会一直存在




    兄弟你对dataview 问题不大    但是你对整个clr对象生存期很不了解哦

    可以找一下  clr  GC 的资料
    工作突然有点忙 嘿嘿
    2009年4月21日 2:04
  • datatable db = xxxxx.getdata();   //把一个datatable的引用装入db 


    datagridview1.datasource=db;   //把db里面的datatable引用装入  datasource 属性里

    db=null;    //吧 db里面对于datatable 的引用取消掉  此时 datasource 属性还在

    datagridview1.datasource=null;      //把 datasource 里面对于datatable 的引用取消掉  此时 datatable 没有任何外部引用, 进入垃圾回收队列

    工作突然有点忙 嘿嘿
    2009年4月21日 2:07