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

推荐订阅源

J
Java Code Geeks
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
有赞技术团队
有赞技术团队
博客园 - 【当耐特】
云风的 BLOG
云风的 BLOG
Martin Fowler
Martin Fowler
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
量子位
Engineering at Meta
Engineering at Meta
博客园 - 叶小钗
T
The Blog of Author Tim Ferriss
Recent Announcements
Recent Announcements
罗磊的独立博客
B
Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
U
Unit 42
Microsoft Azure Blog
Microsoft Azure Blog
D
Docker
N
Netflix TechBlog - Medium
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
B
Blog RSS Feed
I
InfoQ
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
V2EX

龙天小筑

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这个控件,感觉略有点复杂,因此有些细节就处理的比较一般。好在经过这些调整后,可以正常使用了。特此记录下。