首页 > 学习收获 > 软件网络 > C#中Datagridview的避坑心得
2019
01-25

C#中Datagridview的避坑心得

这几天折腾C#,写了个小工具,需要以毫秒级的速度更新大量数据,测试了几个原生控件,发现还是Datagridview绑定DataSet这种方式最为安全,兼顾性能和数据完整性。

然而DGV这个东西有点过于复杂,内部坑太多,以下为常见问题的避坑指南:

1. 滚动条无效、滚动条不显示。

这个问题有时只会在部分电脑上出现。在我这里是开发环境上测试都OK,在同事的电脑上就会出现滚动条失灵或消失。

确定Datagridview控件本身的Scrollbar属性设置正确,不要将控件的Enable设为False,尽量不要使用Dock。这是基本检查。

这个问题的出现一般是多线程操作数据引发的。实测发现即使子线程操作的是绑定的DataSet,这个问题依然会出现。解决方案是使用委托。判定Datagridview是否需要委托,然后在委托中操作DataSet。样例代码如下:

if (dgv.InvokeRequired)
{
Action<string> actionDelegate = (x) =>
{
DataRow dr = ds.Tables[0].NewRow();
dr[0] = strtmp;
ds.Tables[0].Rows.Add(dr);
};
this.Invoke(actionDelegate, strtmp);
}
else
{
DataRow dr = ds.Tables[0].NewRow();
dr[0] = strtmp;
ds.Tables[0].Rows.Add(dr);
}

代码中dgv为Datagridview控件名,ds为绑定的DataSet控件名,strtmp为待更新的数据。

2. 自动滚动到最后一行失效

一般来说,让Datagridview自动滚动到最后一行,只需要添加如下代码即可实现:

if (this.dgv.Rows.Count > 0)
{
this.dgv.FirstDisplayedScrollingRowIndex = this.dgv.Rows.Count - 1;
}

但如果Datagridview绑定了DataSet,那么在操作DataSet时,千万不要使用Tables[0].AcceptChanges() 方法。一旦进行AcceptChanges,那么Datagridview将会自动跳回第一行。

实测无需进行AcceptChanges,数据依然可以正常更新。当然,如果决定将这个自动滚动放在子线程里面,一样需要使用委托。

总结:也许是我技术不到家的缘故,总觉得dgv这个控件,感觉略有点复杂,因此有些细节就处理的比较一般。好在经过这些调整后,可以正常使用了。特此记录下。

最后编辑:
作者:龙天
这个作者貌似有点懒,什么都没有留下。

留下一个回复

你的email不会被公开。