C#DataGridView未使用DataTable进行更新

时间:2014-12-17 15:25:38

标签: c# datagridview datatable

我有一个带有一些数据的DataTable,我用这个代码将它与我的DataGridView绑定:

dataGridView1.DataSource = Measures.Table;

在单独的线程中,我从连接的设备读取数据,并使用以下代码将其插入到我的DataTable中:

DataRow row = table.NewRow();
row[ "Time" ] = dt;
foreach ( var kvp in measures )
    row[ kvp.Key ] = kvp.Value;
table.Rows.Add( row );

在我的表格上,我可以用一个按钮更改它的主控制。这两个控件都是UserControl,其中一个包含dataGridView1 DataGridView。当我向DataTable添加一行时,我的DataGridView不会更新,直到我切换到另一个控件,然后返回到带有DGV的那个。

我已经在堆栈上阅读了一些解决方案,它基本上告诉我应该使用BindingSource,但这段代码:

BindingSource source = new BindingSource();
source.DataSource = Measures.Table;
dataGridView1.DataSource = source;

不起作用。

我不知道为什么会这样,因为我还创建了一个简单的应用程序,只用DGV和DataTable更新了Timer.Tick事件,它在那里工作。任何人都知道为什么这个DGV没有自我更新?它只在强制重绘时才会自动更新(使用切换控件或只是调整大小)

3 个答案:

答案 0 :(得分:1)

首先,数据网格绑定到数据表的DataView,并在内部处理以使用source.DefaultView。

将记录添加到表格后,通过Items ...

发出刷新

dataGridView1.Items.Refresh();

你不应该重新绑定源代码...如果你正在从另一个线程执行items.refresh,请注意,因为网格是基于UI的而不是幕后的。

答案 1 :(得分:0)

好的,所以我找到了罪魁祸首......(我; P)。原因是,它适用于一个简单的小应用程序而且它在我的主应用程序中并不是很简单:

  1. 主要应用在DataTable中实现DT(后来称为BackgroundWorker),我在其中汇集设备以获取新数据。 BackgroundWorker.DoWork事件在UI线程之外运行,因此如果我在那里更新DT,它会触发同一线程中的所有DT事件,因此UI实际上不知道{ {1}}。
  2. 基于DT - Timer.Tick事件的简单应用程序在UI线程中触发,因此不需要Tick,并且在UI线程中触发每个更改Invoke的事件,让DataTable对任何变化做出反应。
  3. 换句话说,为了让它成功,没有DGVDGV.Refresh()我必须在UI线程中更新DGV.Items.Refresh(),这就是我的工作方式这样:

    DataTable

答案 2 :(得分:0)

不要忘记这一行

datatable.AcceptChanges();