频繁绑定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!

不破坏DataSource的结构绑定空数据到dataGridView控件

dataGridView控件中的行为手动通过Add()方法添加的时候可以通过Rows.Clear()方法清除数据;但是如果是通过DataSource绑定的话不能通过此方法清除,会报“不能清除此列表”的...
  • jumtre
  • jumtre
  • 2013-06-28 11:53:41
  • 1360

winform datagridview 不显示默认第一列 不显示未绑定列 数据源发生改变时自动更新

不显示带星号的第一列: datagridview属性框中将 RowHeadersVisiber 设置为true. 不显示未绑定列: datagridview有一个属性是 AutoGenerate...
  • wolfalcon
  • wolfalcon
  • 2012-11-22 19:30:04
  • 5437

C#控件DataGridView的DataSource属性设为DataView和DataTable的区别

先定义 DataGridView dgv; DataView dv; DataTable dt; 假如上面三个对象都已初始化,dgv为一个DataGridView控件。 dgv的DataSourc...
  • XueminXu
  • XueminXu
  • 2012-10-29 13:55:09
  • 1634

C# DataGridView 绑定 DataTable 正确用法

C# DataGridView 绑定 DataTable 正确用法
  • s4gg
  • s4gg
  • 2017-02-03 15:27:15
  • 8515

Windows Form程序绑定datagridview后数据不显示

用datatable绑定数据到datagridview后,数据不显示。后来跟踪代码,查看到datatable和datagridview都有数据,而且页面也显示了相应的行数,只是数据都是空白。 ...
  • lance_lot1
  • lance_lot1
  • 2014-01-06 09:44:40
  • 3346

DataReader绑定DataGridView的两种方法

第一种:借助于BindingSource sqlDataReader Sdr=通过查询函数得到的sqlDataReader类型的数据; BindingSource Bs=new BindingSo...
  • zhangqiang0551
  • zhangqiang0551
  • 2014-06-13 13:03:55
  • 1432

浅谈DataTable、DataSet与DataView,DataGridView,DataSource之间的联系

DataTable DataSet DataView DataGirdView Dat
  • superior_yong
  • superior_yong
  • 2014-05-16 15:54:31
  • 3632

DataGridView DataSource 如何实现排序

将数据绑定在下面的类中就可以实现排序 public class SortableBindingList : BindingList { private ArrayList...
  • norsd
  • norsd
  • 2015-09-01 12:23:19
  • 1882

使用bindingsource数据绑定时datagridview单元格无法及时刷新的问题

数据绑定设置: bindingSource1.DataSource = dataset.Tables[0]; dataGridView1.DataSource = bindingSource1; c...
  • mygisforum
  • mygisforum
  • 2011-10-17 10:48:54
  • 7610

手动绑定BindingNavigator控件,用于实现DataGridView的导航

 当使用DataGridView等控件进行数据显示时,可以使用Navigator控件对数据进行导航 实施的步骤应为: 1.创建dadapter   对象,并设置DataAdapter对象的对应Comm...
  • chen_dian_dian
  • chen_dian_dian
  • 2009-03-01 22:02:00
  • 3350
收藏助手
不良信息举报
您举报文章:频繁绑定DataGridView的DataSource却不正常显示
举报原因:
原因补充:

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