DataGridView.DataSource=dt;
SPMC.DataSource = dt;
SPMC.DisplayMember = "spmc";
SPMC.ValueMember = "spmc";
dt.Dispose();
当执行完
dt.Dispose();可以断点看一下
dt对象本身没有立即被垃圾回收器回收,而是他们相对于两个控件的引用关系发生了变化
这时的DataGridView.DataSource还是引用dt,而SPMC.DataSource已经为null了这里问一下如梦大哥,为什么会有这样的不同呢?

解决方案 »

  1.   

    把dt.Dispose();去掉再看看两个DataSource的状态。
      

  2.   

    不好意思,忘记补充一下题目,SPMC是combobox
      

  3.   


    dt.Dispose();
    前应该加一个邦定函数,dt里面的数据才能显示在控件里面
      

  4.   

    dt.Dispose()时,会把自己从宿主容器中移除:
    this.Site.Container.Remove(this);
    并且引发Disposed事件SPMC类要么在设置DataSource属性的时候,把自己设置成了dt的宿主容器,要么监听了dt的Disposed事件,所以在dt.Dispose后能够把自己的DataSource属性重设成null,而DataGridView没有这样做。
      

  5.   

    combobox是通过监听dt.Disposed事件来实现的:在对combobox设置datasource时,会执行:
      ((IComponent) this.dataSource).Disposed += new EventHandler(this.DataSourceDisposed);
    完成注册dt.Disposed事件:在combbox的DataSourceDisposed方法中,调用私有方法:
     this.SetDataConnection(null, new BindingMemberInfo(""), true);
    把datasource属性设成null