c#如何使用线程操作datagridview

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c#如何使用线程操作datagridview相关的知识,希望对你有一定的参考价值。

我在做一个数据查询报表软件,想从数据库中取出数据,然后放入datagridview中。这个功能已经实现。我想做的是,利用线程来操作写入datagridview。
问题:当写入datagridview完毕后,貌似线程把该控件给卡住了,没有办法拖动它的滚动条,请问各位大侠如何解决?
希望给出一个示例,谢谢

参考技术A public delegate void Handler(FlexCell.Grid param1, int param2);

/// <summary>
/// 锁定行(供线程内部使用)
/// </summary>
/// <param name="cellGrid">需要锁定的Flex控件</param>
/// <param name="row">需要锁定的行</param>
public static void lockCell(FlexCell.Grid cellGrid, int row)

//EventHandler ehLockCell = new EventHandler(flexCell_Lock);
//ehLockCell(this, null);
if (cellGrid.InvokeRequired)

//Handler handlock = new Handler(lockCell);
cellGrid.Invoke(new Handler(lockCell), new object[] cellGrid, row );


else

lock (cellGrid)

//FlexCell.Grid cellBanlance = (FlexCell.Grid)tabBalance.TabPages["2008"].Controls[0];
cellGrid.Row(row).Locked = true;
cellGrid.Range(row, 2, row, cellGrid.Cols - 1).BackColor = AppHelper.MatchColorScheme(6);


本回答被提问者采纳
参考技术B 用delegate
创建一个thread,然后用invoke调用delegate对应的函数

这个问题是关于C#线程内部操作datagridview 使数据重新加载实现向上跑动!!!

,具体就是如果用按钮操作就可以,但是放到线程里面与运行就会出现未将对象引用到实例的异常,并且,datagridview区域出现红色叉号,图就不发了,设计到公司机密以及隐私,觉得可以解决的,留言!!!
是帮我解决哦 。。。不是说一堆我听不懂的 发一些我看不懂的 。。

由于你没给更多的数据,我只能给你以下代码,你自己试试吧。

(new Thread(new ThreadStart(() =>

    DataTable dt = new DataTable();
    dt.Columns.Add("A");
    dt.Rows.Add("A1");
    if (dataGridView1.InvokeRequired)
    
        dataGridView1.BeginInvoke(new MethodInvoker(() =>
        
            dataGridView1.DataSource = dt;
        ));
    
    else
    
        dataGridView1.DataSource = dt;
    
))).Start();

 

PS:简便写法需要framework>=3.5

追问

怎么联系呢 我折代码发上来超出范围了 。

追答

你可以回帖的时候,传附件!可以从本地也可以从网盘!

追问

http://pan.baidu.com/s/1hqBRdaO 代码在这里求看看 。。

追答

童鞋,我看了!你虽然用了线程,但是,gridview还是主UI线程里面的!
仿造我上面的写法,对你的LoadExcel()方法进行改造即可!

追问

老师 我才毕业 不懂啊 帮帮忙呗!!!

参考技术A CheckForIllegalCrossThreadCalls = false;
CheckForIllegalCrossThreadCalls在.net1.x中默认是false,也就是不检查,.net2.0和3.x默认是true
也就是说你也可以直接用.net 1.x
死穴:安全性 CheckForIllegalCrossThreadCalls容许子线呈随时更新ui,在同一个test函数体内,不能保证自身事务的一致性。给label1付了值 一回头,就已经被别人改了,这和超市的踩踏事件的后果一样严重。 当然你可以自己加锁,用信号量,这样还不如直接使用Invoke了,你只是又把别人做好的事情做了一遍。
如果你觉的你的应用不会考虑在写入ui的同时来读取ui,而倾向使用CheckForIllegalCrossThreadCalls来追求效率的话,也是不恰当的做法。 首先CheckForIllegalCrossThreadCalls并不能让效率发生本质的变化。 其次需求永远是变化的,现在不考虑不等于以后不会碰到 听从ms的引导。否则以后要在高版本的.net framework中移植代码的时候需要花费数倍的人工。追问

http://pan.baidu.com/s/1hqBRdaO 代码在这里 。

追答

加上了不好使么。?

追问

加上什么 ?往哪里加 ?代码是啥呢?

追答

CheckForIllegalCrossThreadCalls = false;
加到你出错代码前面,我一般都是加到初始化里面。

追问

还是那样 。

参考技术B 多线程更新窗体控件推荐使用委托,可以参考这篇文章 http://www.cnblogs.com/hnfxs/p/3192009.html
如果嫌前面的内容麻烦就直接看最后的那个方法就行了。追问

看不懂 刚毕业 。

追答

看不懂就多看几次,不是所有的问题都有现成的代码给你copy。
最后一个方法已经给出完整例子了,照着它创建一个工程来测试一下,搞清楚每一句代码的作用,很快就能明白怎么做了。

追问

别说这些没有用的 会就给我解决 。

以上是关于c#如何使用线程操作datagridview的主要内容,如果未能解决你的问题,请参考以下文章

C#如何在BackgroundWorker 后台线程中使用定时器?

C#多线程之线程池篇3

C#多线程与异步的区别

C#进阶系列27 I/O限制的异步操作

C# socket服务器端 多线程客户端 如何少量使用CPU

如何在 C# 中获取 CPU 逻辑内核/线程的数量?