惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 叶小钗
Last Week in AI
Last Week in AI
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
雷峰网
雷峰网
GbyAI
GbyAI
Hugging Face - Blog
Hugging Face - Blog
N
Netflix TechBlog - Medium
博客园 - 聂微东
Y
Y Combinator Blog
罗磊的独立博客
博客园_首页
小众软件
小众软件
有赞技术团队
有赞技术团队
爱范儿
爱范儿
F
Fortinet All Blogs
C
Check Point Blog
Google DeepMind News
Google DeepMind News
云风的 BLOG
云风的 BLOG
Apple Machine Learning Research
Apple Machine Learning Research
M
MIT News - Artificial intelligence
月光博客
月光博客
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
aimingoo的专栏
aimingoo的专栏

龙天小筑

Stable Diffusion Webui无显卡安装 - 龙天小筑 Stable Diffusion Webui无显卡安装 - 龙天小筑 Stable Diffusion Webui无显卡安装 | 龙天小筑 Stable Diffusion Webui无显卡安装 | 龙天小筑 诸城印象2022-嵊州 诸城印象2022-嵊州 - 龙天小筑 诸城印象2022-嵊州 | 龙天小筑 诸城印象2022-嵊州 | 龙天小筑 COVID-19抗疫备忘 COVID-19抗疫备忘 - 龙天小筑 COVID-19抗疫备忘 | 龙天小筑 COVID-19抗疫备忘 | 龙天小筑 诸城印象2022—珠海 诸城印象2022—珠海 - 龙天小筑 诸城印象2022—珠海 | 龙天小筑 诸城印象2022—珠海 | 龙天小筑 LNMP环境下WordPress站点健康状态问题清零 LNMP环境下WordPress站点健康状态问题清零 - 龙天小筑 LNMP环境下WordPress站点健康状态问题清零 | 龙天小筑 LNMP环境下WordPress站点健康状态问题清零 | 龙天小筑 越狱iOS安装TikTok踩坑指南 越狱iOS安装TikTok踩坑指南 - 龙天小筑 越狱iOS安装TikTok踩坑指南 | 龙天小筑 越狱iOS安装TikTok踩坑指南 | 龙天小筑 再次启用SSL 再次启用SSL - 龙天小筑 再次启用SSL | 龙天小筑 再次启用SSL | 龙天小筑 RSA/3DES及加解密 RSA/3DES及加解密 - 龙天小筑
C#中Datagridview的避坑心得 - 龙天小筑
龙天 · 2019-01-25 · via 龙天小筑
这几天折腾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这个控件,感觉略有点复杂,因此有些细节就处理的比较一般。好在经过这些调整后,可以正常使用了。特此记录下。