【问题标题】:C# DataGridView is not updating with DataTableC# DataGridView 不使用 DataTable 更新
【发布时间】:2014-12-17 15:25:37
【问题描述】:

我有一个包含一些数据的 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 不更新自身的任何原因吗?它仅在强制重绘时更新自身(使用切换控件或仅调整表单大小)

【问题讨论】:

  • 不清楚您是否使用对同一对象的引用。如果添加新行的代码针对表的不同实例执行此操作,那么您应该预料到这种行为
  • 是同一个实例。 Measures 是一个单例,我用它处理将数据添加到数据表、将它们记录到文件和其他一些东西。 Measures.Table 只是一个愚蠢的属性 { get { return table } }。此外,正如我在上面所写的,我只需要强制重绘任何东西(比如调整表格大小),DGV 就会显示需要的内容。

标签: c# datagridview datatable


【解决方案1】:

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

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

dataGridView1.Items.Refresh();

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

【讨论】:

  • DGV 没有 Items 属性(可能是因为我使用 WinForms),但确实有 Refresh() 方法。从不同的线程调用RefreshInvoke 来说不是问题;)这(Refresh())部分解决了我的问题。 DGV 更新,但总是落后 1 条记录(当我在表中有 2 条记录时,我在 DGV 中只有 1 条记录,即使在我的测量停止后它也会保持这种状态)。我正在DataTable.TableNewRow 活动中刷新 DGV。 ...无论如何,谢谢,现在只支持,因为我正在尝试找到更好的解决方案;)
【解决方案2】:

不要忘记这一行

datatable.AcceptChanges();

【讨论】:

    【解决方案3】:

    好的,所以我找到了罪魁祸首……(我;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 ) );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-15
      • 2013-07-11
      • 2012-04-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多