奇怪,datatable 没有清除掉。

xuyufeng822 2009-04-16 08:07:55
1.我在写程序的时候,如果一个窗体有 datagridview ,我一般就习惯把 datatable 建立成全局的,DataTable dt=new DataTable();

然后在当前文档的别的函数或按钮事件里也可以访问到 dt,并且在每个模块下如果需要填充 dt 就先清空他, dt.Clear();

可是我发现有的时候 Clear() 清空不了 dt,如下所示,我的 dt 是全局的,我在 窗体的 ComBox1的 SelectedValueChanged 事件中

if (ComBox1.Text == "北侧")
{

string sql = "select SL2_TB_X_NORTH_FAN_LOG.*,SL2_TB_X_NORTH_FAN_TEMP_LOG.* from SL2_TB_X_NORTH_FAN_LOG,SL2_TB_X_NORTH_FAN_TEMP_LOG where TO_CHAR(SL2_TB_X_NORTH_FAN_LOG.RECORD_DATE,'YYYY-MM-DD HH24') = TO_CHAR(SL2_TB_X_NORTH_FAN_TEMP_LOG.RECORD_DATE,'YYYY-MM-DD HH24') ";
OracleDataAdapter oda = new OracleDataAdapter(sql, connectDB.m_cnOrclQy);
OracleCommandBuilder ocb = new OracleCommandBuilder(oda);
oda.Fill(dt);
dgvMain.DataSource = dt;
dgvColHeaderA(dgvMain);
}
else if (ComBox1.Text == "南侧")
{
string sql = "select SL2_TB_X_SOUTH_FAN_LOG.*,SL2_TB_X_SOUTH_FAN_TEMP_LOG.* from SL2_TB_X_SOUTH_FAN_LOG,SL2_TB_X_SOUTH_FAN_TEMP_LOG where TO_CHAR(SL2_TB_X_SOUTH_FAN_LOG.RECORD_DATE,'YYYY-MM-DD HH24') = TO_CHAR(SL2_TB_X_SOUTH_FAN_TEMP_LOG.RECORD_DATE,'YYYY-MM-DD HH24') ";
OracleDataAdapter oda = new OracleDataAdapter(sql, connectDB.m_cnOrclQy);
OracleCommandBuilder ocb = new OracleCommandBuilder(oda);
oda.Fill(dt);
dgvMain.DataSource = dt;
dgvColHeaderB(dgvMain);
}

但是我每次切换 combox1 的 内容的时候都先 clear DT,但是我发现怎么一切换 Dt 的列就多了一倍呢,行没变,就列多了,并且如果多的话,那么再次切换就应该还继续多啊,可是就多一回,就不变了,我就奇怪了,我每次都是 clear 了啊。
我那个 SQL 语句的意思是从两个表查询 时间字段相等的记录,时间比较只精确到小时。

2.还有我每次设置 datagridview格式样式的时候是把datagridview作为参数传进一个函数里, dgvset(datagridview1)
函数 dgvset(Datagridview dgv)
{
dgv.BackgroundColor = Color.White;
dgv.RowHeadersWidth = 15;
……
}
这样的方法有什么缺点吗?
...全文
252 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuyufeng822 2009-05-05
  • 打赏
  • 举报
回复
我发现我 dt.clear() 是清除表的行,而我的那个 SQL 语句是联合查询,所以好像 dt 的列 就多了
但 只多一回,再选择就不再多了,还是没太弄明白
xuyufeng822 2009-04-24
  • 打赏
  • 举报
回复
只是在当前窗体下的全局,这样别的控件要是需要不就可以用了么
cppfaq 2009-04-24
  • 打赏
  • 举报
回复
为什么要全局共享呢?
万恶之源
xuyufeng822 2009-04-24
  • 打赏
  • 举报
回复
我知道我为什么没清除掉了,因为我 dt.clear 只是清除了行,并没清除列,而我这种两个表查询是把两个表的列并在一起的,所以列就多了一倍
uncleson88 2009-04-17
  • 打赏
  • 举报
回复
1、好象没看到你的代码中有 dt.Clear()啊,你最好把dt.Clear()放在Fill语句的前一句应该就没问题。
2、datagridview完全可以作为参数,反正是个引用,不会有任何的性能影响。
yongyupost2000 2009-04-17
  • 打赏
  • 举报
回复
你清除还不如将这个dt =null 再使用
xuyufeng822 2009-04-17
  • 打赏
  • 举报
回复
dt.Clear()
我有,是在语言里说的,但是也不行
反正只要 dt 是全局的就容易出错


first_speed 说的不太对吧,把dt每次用都 new ,那不是在内存中多了很多的 dt 的新对象,如果数据量大的话,那么很浪费资源啊
除非不用的时候能释放资源
first_speed 2009-04-16
  • 打赏
  • 举报
回复
还有就是我感觉DataGridView在绑定数据源后可能是会新生成一个自己的数据集,我试过在DataGridView中用Romve()移除数据后比较DT or DS 中数据行的变化,DataGridView中的数据行减少了,但是DT中的没有变化,所以我感觉应该不是完全的绑定,只是相当复制了一下DT中的数据,可能问题在于你没有清空DataGridView中的数据吧
first_speed 2009-04-16
  • 打赏
  • 举报
回复
我不知道问题一不一样,我以前写的一个DataGirdView中也会出项增加的问题,但是是行增加了
我的解决方法是DataGridView.DataSource = null;
然后再从新连接DataTable
而且我定义的DataTable一开始没有new只用调用的时候才new,教我的人说这样节约内存,还有就是new以后可定不存在是否清空的问题了


我是个新手,不对的地方请指出来,谢谢
xue1234567890 2009-04-16
  • 打赏
  • 举报
回复
如果不是重要的文件的话,代码贴出来吧..
zzh330522 2009-04-16
  • 打赏
  • 举报
回复

xuyufeng822 2009-04-16
  • 打赏
  • 举报
回复
dt.clear()加在dgvColHeaderB(dgvMain); 之后

那dt 不就没数据了吗,那跟局部的差不多了啊,我设置成局部的 dt 就不会出那样的错误,但是我现在的 dt 是全局的
xue1234567890 2009-04-16
  • 打赏
  • 举报
回复
1.dt用完之后 dt.clear()吧. 也就是说,dt.clear()加在dgvColHeaderB(dgvMain); 之后...
lz自己设断点调试看看吧..应该是调用两次了...

2.如果datagridview的数据量小的话,看起来没什么问题, 但是数据量大的话, 问题就大了...比如有几十万条数据...
所以最好不要那么做...

111,126

社区成员

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

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

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