这个系列的文章,主要是平时做C#.NET(Framework 3.5)开发的时候,积累的经验和技巧。我们平时总有这样的体会,遇到一个特别难解决的问题,网上寻它千百度也没能搜索到有用的信息。这时你肯定会想,解决了这个问题一定要记下来。实际上待你埋头苦干终于搞定它的时候,往往被喜悦和成就感充斥,再加上这个问题本身解决的方法可能简单无比,于是忘记去记录下来。本篇就从零开始,回顾五年编程经验积累的各种奇葩问题的解决方法。

DataGridView是个神奇的控件,与数据集绑定显示,方便、耐用。但是这样一个封装了99%内部实现的控件,必然会出现你让你抓狂的异常。

来看今天遇到的问题:主窗口有一个DataGridView控件,它的DataSource是atable;在线程中获取一行数据arow,添加到atable中,然后invoke主线程去修改MainForm上一个Label的Text。线程函数代码如下:

threadfun()
{
//...... atable.AddRow(arow); Invoke(adelegate); //......
}

测试exe程序的时候出现主界面无响应的情况,反复重启发现每当添加第N条数据后问题出现,N是某个定值。使用VS调试源代码,问题消失。

做C#开发最难受的情况就是,VS调试一切OK,运行exe出错。这种情况我们以后会经常遇到,可以理解为.Net Framework的运行时和调试时是略有不同的,不再深入追究。使用VS附加进程调试,找到源头是invoke的委托代码执行被挂起,导致主界面无响应。

解决方法:在线程中,对DataGridView的数据源进行的操作都使用委托。

分析:数据表atable是DataGridView的数据源,DataGridView是主线程的控件,虽然在线程函数里可以访问同一命名空间下的引用,但是一旦牵扯到控件,最好还是让主线程去操作,否则就会出现各种意想不到的问题,比如今天遇到的。

刨根问底:向atable添加一行arow,这会导致DataGridView重绘,因为绑定的数据源自动显示。从这个角度来看,今天的例子犯了一个常见的错误:从线程修改主线程控件。特殊的地方是这个重绘操作是.Net内部通过某种机制实现的,它并不违反约束,前N-1次操作并没有异常发生就能看出来。那么,为什么第N次添加操作就一定会触发这个问题呢?

真相:通过观察视图设计,我发现第N条数据会使DataGridView自动添加纵向滚动条,为了验证这是否是真相,我减小了DataGridView的高度,果然小于第N条数据就出现了问题,从而确定就是这个添加滚动条的动作导致主线程挂起,窗口无响应。

总结:想弄明白这个问题的最终答案,必须完全理解DataGridView的内部实现机制,这个机制允许从线程向DataGridView添加行并显示,但是当自动创建滚动条的时候会挂起,我想这也算是一个bug了吧。从我们开发者自身角度来讲,保持一个良好的编程习惯至关重要——线程不访问其他线程的变量,必须访问的时候所有操作都用委托。如果上述例子的开发者能遵循这个原则,就不会遇到这个难题。

C#.NET,技巧篇(DataGridView线程操作)的更多相关文章

  1. 《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)

    1.简介 有些测试场景或者事件,Selenium根本就没有直接提供方法去操作,而且也不可能把各种测试场景都全面覆盖提供方法去操作.比如:就像鼠标悬停,一般测试场景鼠标悬停分两种常见,一种是鼠标悬停在某 ...

  2. 《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)

    1.简介 本文主要介绍两个在测试过程中可能会用到的功能:Actions类中的拖拽操作和Actions类中的划取字段操作.例如:需要在一堆log字符中随机划取一段文字,然后右键选择摘取功能. 2.拖拽操 ...

  3. 《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)

    1.简介 上一篇中,宏哥说的宏哥在最后提到网站的反爬虫机制,那么宏哥在自己本地做一个网页,没有那个反爬虫的机制,谷歌浏览器是不是就可以验证成功了,宏哥就想验证一下自己想法,于是写了这一篇文章,另外也是 ...

  4. 《手把手教你》系列技巧篇(三十三)-java+ selenium自动化测试-单选和多选按钮操作-上篇(详解教程)

    1.简介 在实际自动化测试过程中,我们同样也避免不了会遇到单选和多选的测试,特别是调查问卷或者是答题系统中会经常碰到.因此宏哥在这里直接分享和介绍一下,希望小伙伴或者童鞋们在以后工作中遇到可以有所帮助 ...

  5. 《手把手教你》系列技巧篇(三十四)-java+ selenium自动化测试-单选和多选按钮操作-中篇(详解教程)

    1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历单选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的单选按钮进行实战. 2.d ...

  6. 《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)

    1.简介 今天这一篇宏哥主要是讲解一下,如何使用list容器来遍历多选按钮.大致两部分内容:一部分是宏哥在本地弄的一个小demo,另一部分,宏哥是利用JQueryUI网站里的多选按钮进行实战. 2.d ...

  7. 《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)

    1.简介 前边几篇文章是宏哥自己在本地弄了一个单选和多选的demo,然后又找了网上相关联的例子给小伙伴或童鞋们演示了一下如何自动化测试,这一篇宏哥在网上找了一个问卷调查,给小伙伴或童鞋们来演示一下.上 ...

  8. 《手把手教你》系列技巧篇(五十)-java+ selenium自动化测试-字符串操作-上篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

  9. 《手把手教你》系列技巧篇(五十一)-java+ selenium自动化测试-字符串操作-下篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

随机推荐

  1. struts2学习笔记(二)—— 获取登录信息及计算在线人数

    实现目的:       1.点击"Login"的超链接.进入登录页面       2.填写登录信息.提交表单,将用户信息保存进Session       3.显示用户名,并计算在线 ...

  2. centos 命令行中 * 和 . 的区别

    錯誤    cp /home/test1/* /home/test2/ –a          用參數*將不可以複製linux中.開頭的隱藏文件 正確    cp /home/test1/. home ...

  3. 改變iTunes備份路徑

    *** 在任意分區建立文件夾用來移動iTunes原有備份 *** 例如:move"c:\user\vhd\appdata\roaming\apple computer"全部到&qu ...

  4. kvc kvo 总结---180313

    textField.placeholder = @"username is in here!"; [textField setValue:[UIColor redColor] fo ...

  5. Nginx + FastCgi + Spawn-fcgi + C 架构的server环境搭建

    1.Nginx 1.1.安装 Nginx 的中文维基 http://wiki.codemongers.com/NginxChs 下载 Nginx 0.6.26(开发版)(请下载最新版本号) tar z ...

  6. python 【第一篇】初识python

    人生苦短,我用python Python是我喜欢的语言,简洁.优美.容易使用.所以我总是很激昂的向朋友宣传Python的好处. python起源 1989年,为了打发圣诞节假期,Guido开始写Pyt ...

  7. JSON入门指南

    JSON 即 JavaScript Object Natation,它是一种轻量级的数据交换格式,很适合于server与 JavaScript 的交互.本文将高速解说 JSON 格式.并通过代码演示样 ...

  8. 一条SQL语句面试题:求选修所有课程的学生

    前几天求职面试,有一道SQL题:给出三个表:学生.课程.成绩,求选修了所有课程的学生. 一道看似很简单的问题,把我难住了,我改了又改,涂涂画画,抓耳挠腮,因为试卷没有多少空白位置了,最后只好放弃.心情 ...

  9. luogu1941 飞扬的小鸟

    题目大意 游戏界面是一个长为n ,高为 m 的二维平面,其中有k 个管道(忽略管道的宽度).小鸟始终在游戏界面内移动.小鸟从游戏界面最左边任意整数高度位置出发,到达游戏界面最右边时,游戏完成.小鸟每个 ...

  10. Ubuntu 16.04 + github page + hexo 搭建博客

    1. 安装nodejs:  sudo apt-get install nodejs-legacy 2.安装nvm :  wget -qO- https://raw.github.com/creatio ...