问题

guanmingle 2010-10-16 01:14:14
DataGridView.DataSource=dt;
SPMC.DataSource = dt;
SPMC.DisplayMember = "spmc";
SPMC.ValueMember = "spmc";
dt.Dispose();
当执行完
dt.Dispose();可以断点看一下
dt对象本身没有立即被垃圾回收器回收,而是他们相对于两个控件的引用关系发生了变化
这时的DataGridView.DataSource还是引用dt,而SPMC.DataSource已经为null了

这里问一下如梦大哥,为什么会有这样的不同呢?
...全文
95 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
jshi123 2010-10-16
  • 打赏
  • 举报
回复
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
jshi123 2010-10-16
  • 打赏
  • 举报
回复
dt.Dispose()时,会把自己从宿主容器中移除:
this.Site.Container.Remove(this);
并且引发Disposed事件

SPMC类要么在设置DataSource属性的时候,把自己设置成了dt的宿主容器,要么监听了dt的Disposed事件,所以在dt.Dispose后能够把自己的DataSource属性重设成null,而DataGridView没有这样做。
int64 2010-10-16
  • 打赏
  • 举报
回复

dt.Dispose();
前应该加一个邦定函数,dt里面的数据才能显示在控件里面
guanmingle 2010-10-16
  • 打赏
  • 举报
回复
不好意思,忘记补充一下题目,SPMC是combobox
叶子 2010-10-16
  • 打赏
  • 举报
回复
把dt.Dispose();去掉

再看看两个DataSource的状态。
一切为了你 2010-10-16
  • 打赏
  • 举报
回复
我也没看懂
guanmingle 2010-10-16
  • 打赏
  • 举报
回复
顶1顶
guanmingle 2010-10-16
  • 打赏
  • 举报
回复
就这么简单?好像有点想不通哎
wuyq11 2010-10-16
  • 打赏
  • 举报
回复
DataGridView使用dt的副本

110,539

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧