频繁绑定DataGridView的DataSource却不正常显示

原创 2013年07月25日 23:11:03

最近在写一个多线程程序,需要跨线程访问DataGridView,绑定其DataSource,而且由于线程几乎是每隔几秒都会重新绑定一次DataGridView的DataSource的,所以,遇到各种蛋疼的问题。

首先说一个最常见最容易想到的办法:

首先在主线程设置System.Windows.Forms.Control.CheckForIllegalCrossThreadCalls = false;,随后去Designer.cs文件中将DataGridView的声明修改成public static 然后,在自定义的线程中直接使用datagridview1.DataSource =dt;然后结果是程序莫名的卡死。

上网一查,大家都说跨线程访问控件时这么禁用跨线程调用检查是不科学的,需要声明一个委托来访问,于是继续折腾写了如下代码

public delegate void SetDGVSource(DataTable dt);
        public static void SetDGVSourceFunction(DataTable dt)
        {

            if (dataGridView1.InvokeRequired)
            {
                SetDGVSource delegateSetSource = new SetDGVSource(SetDGVSourceFunction);
                dataGridView1.Invoke(delegateSetSource, new object[] { dt });
            }
            else
            {
                dataGridView1.DataSource = dt;
                dataGridView1.Columns[dataGridView1.Columns.Count - 1].Visible = false;//设置最后一列不可见

            }
        }

这样确实可以访问了,当时,发现当程序运行了分吧钟的样子,问题又莫名其妙的来了:莫名的崩溃。

后来继续查资料,在论坛看到有人说需要添加什么绑定,发现不靠谱(WinForm程序不需要,那是ASP.NET的),继续查阅,有人说需要将DataGridView的一个属性改一下,

dataGridView1.AutoGenerateColumns = true;

然后我就老老实实的添加了,然后出现的问题更加奇葩

屏幕上的datagridview依然是一片空白,貌似根本没有添加上,正当丧气之时,猛然间发现鼠标经过datagridview的空白区时,鼠标由指针变成了手型,这不是说明datagridview里面有东西么!!!!!果然,将鼠标在datagridview里面胡乱点击拖动,就看到datagridview的一行行就这么被我一拖,它就显示出来了,我拖动一行就显示一行。。。。

蛋疼无比啊!!!!

不过在进一步的Debug中,我发现,如果不是频繁的刷新datagridview的DataSource的话,目测他又是正常的。。。

后来继续慢慢摸索,发现,在不改变设置DataSource的绑定频率的情况下,如果改用手动绑定DataSource,他又神奇般的好了。。。。

代码如下:

datagridview1.Rows.Clear();  
foreach (DataRow dr in dt.Rows)  
{  
    datagridview1.Rows.Add(dr["姓名"], dr["年龄"]);  
} 

就这样居然就可以解决我的问题了!真是喜极而泣。。。

也许是datagridview里面的DataSource直接绑定有什么机制导致了它不能够频繁的更新吧。只能采用手动方式。当然了,类似于上面的方法,还可以使用下面的更加简洁的代码

datagridview1.DataSource =dt.Copy();

最终我的代码如下:

public static void SetDGVSourceFunction(DataTable dt)
        {

            if (dataGridView1.InvokeRequired)
            {
                SetDGVSource delegateSetSource = new SetDGVSource(SetDGVSourceFunction);
                dataGridView1.Invoke(delegateSetSource, new object[] { dt });
            }
            else
            {
                dataGridView1.DataSource = dt.Copy();
                //dataGridView1.Rows.Clear();
				//foreach(DataRow dr in dt.Rows)
				//	dataGridView.Rows.Add(dr["姓名"],dr["年龄"]);
                dataGridView1.AutoGenerateColumns = true;
                dataGridView1.Columns[dataGridView1.Columns.Count - 1].Visible = false;//设置最后一列不可见

            }
        }


然后再在其他文件的其他的线程中只需要调用这个函数即可,便可成功的频繁的绑定datagridview的DataSource!

c#DataGridView数据绑定示例——格式化单元格的内容

c#DataGridView数据绑定示例 格式化单元格的内容在使用DataGridView显示数据库中的数据时,我们需要对某列的数据显示格式进行格式化。这里使用实时构建的数据,如下图:在显示时对第三列...
  • testcs_dn
  • testcs_dn
  • 2014年07月15日 22:45
  • 20646

DataGridView控件---绑定数据方法

DataGridView控件是在windows应用程中显示数据最好的方式,它只需要几行简短的代码就可以把数据显示给用户,同时又支持增、删、改操作。今天将自己总结的增加数据的方法总结分享给大家   ...
  • yudandan10
  • yudandan10
  • 2013年07月29日 17:31
  • 65434

WinForm程序用使用List对象绑定DataGridView数据源

1、 在用List对象绑定DataGridView数据源属性的时候,数据源的内容不会动态更新,如果List对象集合中的数据发生变化,那么数据控件的数据源是不会得到更新的。一般也不建议用List去填充数...
  • guokeeryi_
  • guokeeryi_
  • 2014年05月03日 15:55
  • 1242

Winform中的dataGridView添加自动编号

新建一个WinForm项目,在工具栏里拖一个dataGriView到窗体中,默认名称为dataGridView1,把数据源添加到dataGridView1中,运行,看到dataGriView1有数据显...
  • u013558606
  • u013558606
  • 2014年08月02日 11:39
  • 5169

vb.net中将DataGridView与数据源绑定

DataGridView绑定数据源
  • zhangyingjie09
  • zhangyingjie09
  • 2013年08月15日 14:08
  • 7917

DataGridView控件用法(一)绑定数据-修改列值-序号列-交换列顺序

DataGridView控件用法(一):绑定数据-修改列值-序号列-交换列顺序 Wind 撰写于 2012 年 3 月 21 日 | 分类 :C# Winform程序开发 | 没有评论 | 10,2...
  • pashine
  • pashine
  • 2013年10月20日 01:40
  • 11522

datagridview自定义列的数据绑定

最近都在做Winform的小东西,很有锻炼的感觉,时间飞快的,特爽。 不过,也碰到了些许问题,在使用dataGridView进行数据绑定的时候,总是把数据库中整个表显示在页面上,连HeaderTex...
  • aiminXMPP
  • aiminXMPP
  • 2013年02月04日 00:47
  • 2246

如何将下面xml放到datagridview中

XML code xml version="1.0" encoding="utf-8" ?> NewDataSet> Table> node ID="1" 书籍名称="语文...
  • Baple
  • Baple
  • 2014年02月18日 21:02
  • 1485

频繁刷新DataGridView的DataSource会报错

在winform开发中,我们常常会用DataGridView来展现datatable的数据,单次或者不频繁的异步设置其DataSource属性不会有任何问题,但是如果实时的异步刷新其数据,不管你是通过...
  • cxwl3sxl
  • cxwl3sxl
  • 2013年04月16日 11:02
  • 1885

WinForm程序用使用List对象绑定DataGridView数据源

1、 在用List对象绑定DataGridView数据源属性的时候,数据源的内容不会动态更新,如果List对象集合中的数据发生变化,那么数据控件的数据源是不会得到更新的。一般也不建议用List去填充数...
  • shuaishifu
  • shuaishifu
  • 2014年02月28日 10:11
  • 4370
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:频繁绑定DataGridView的DataSource却不正常显示
举报原因:
原因补充:

(最多只允许输入30个字)