C# DataGridView 未使用 DataTable 进行更新

本文关键字:更新 DataTable DataGridView 未使用 | 更新日期: 2023-09-27 18:34:33

我有一个包含一些数据的DataTable,我用下面的代码将其与我的DataGridView绑定:

dataGridView1.DataSource = Measures.Table;

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

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

在我的表单上,我可以用按钮更改它的主要控件。这两个控件都是 UserControl,其中一个控件由 dataGridView1 DataGridView 组成。当我向数据表添加行时,我的 DataGridView 不会更新,直到我切换到另一个控件,并移回具有 DGV 的控件。

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

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

也不起作用。

我不知道为什么会发生这种情况,因为我还创建了一个简单的应用程序,其中只有 DGV 和 DataTable 使用 Timer.Tick 事件进行了更新,并且它在那里工作。有人知道这个DGV不自我更新的任何原因吗?它仅在强制重绘时自行更新(使用切换控件或仅调整窗体大小(

C# DataGridView 未使用 DataTable 进行更新

首先,数据网格绑定到数据表的 DataView,并在内部处理以使用源。默认视图。

将记录添加到表中后,通过项目发出刷新...

dataGridView1.Items.Refresh((;

您不必重新绑定源...如果您正在从其他线程执行 items.refresh,请小心,因为网格是基于 UI 而不是幕后。

不要忘记这一行

datatable.AcceptChanges();

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

  1. 主应用程序在BackgroundWorker中实现DataTable(后来称为DT(,其中我正在汇集设备以获取新数据的可用性。 BackgroundWorker.DoWork事件在 UI 线程之外运行,因此如果我在那里更新DT,它会在同一线程中触发所有DT事件,因此 UI 实际上不知道DT的任何更改。
  2. 基于 Timer.Tick 的简单应用 - Tick事件在 UI 线程中触发,因此不需要Invoke,并且更改DataTable的每个事件都在 UI 线程中触发,这允许DGV对任何更改做出反应。

换句话说,要使其工作,无需DGV.Refresh()DGV.Items.Refresh()我不得不在 UI 线程中更新DataTable,这是我的做法:

var form = System.Windows.Forms.Application.OpenForms[0];
...
form.BeginInvoke( (Action)( () => CODE_THAT_ADDS_ROW_TO_DATATABLE ) );