C#DataGridView未使用DataTable更新

C#DataGridView未使用DataTable更新,c#,datagridview,datatable,C#,Datagridview,Datatable,我有一个包含一些数据的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 ); BindingSource sourc

我有一个包含一些数据的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 );
BindingSource source = new BindingSource();
source.DataSource = Measures.Table;
dataGridView1.DataSource = source;
在单独的线程中,我从连接的设备读取数据,并使用以下代码将其插入我的DataTable:

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 );
BindingSource source = new BindingSource();
source.DataSource = Measures.Table;
dataGridView1.DataSource = source;
在我的窗体上,我可以用一个按钮更改它的主控件。这两个控件都是UserControl,其中一个由dataGridView1 DataGridView组成。当我向DataTable添加一行时,我的DataGridView不会更新,直到我切换到另一个控件并移回带有DGV的控件

我已经阅读了stack上的一些解决方案,它们基本上告诉我应该使用BindingSource,但以下代码:

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 );
BindingSource source = new BindingSource();
source.DataSource = Measures.Table;
dataGridView1.DataSource = source;
也不管用


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

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

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

dataGridView1.Items.Refresh()


您不应该重新绑定源。。。如果您正在执行项目,请小心。请从其他线程刷新,因为网格是基于用户界面的,而不是幕后操作。

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

  • 主应用程序在
    BackgroundWorker
    中实现
    DataTable
    (后来称为
    DT
    ),我在其中汇集设备以获得新数据
    BackgroundWorker.DoWork
    事件是在UI线程之外运行的,因此如果我在那里更新
    DT
    ,它会在同一线程中触发所有
    DT
    事件,所以UI实际上不知道
    DT
    中有任何更改
  • 基于
    计时器的简单应用程序。Tick
    -
    Tick
    事件在UI线程中触发,因此不需要调用
    数据表
    的每个更改事件都在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 ) );
    
    别忘了这句话

    datatable.AcceptChanges();
    

    不清楚是否使用了对同一对象的引用。如果添加新行的代码针对表的不同实例执行此操作,那么您应该认为此behaviorit是同一实例
    Measures
    是一个单件,我用它处理向datatable添加数据、将数据记录到文件以及其他一些事情
    Measures.Table
    只是一个哑属性
    {get{return Table}
    。此外,正如我在上面所写的,我只需要强制使用任何东西(如调整表单大小)重新绘制,DGV就会显示所需的内容。DGV没有
    属性(可能是因为我使用WinForms),但有一个
    刷新()
    方法。从不同的线程调用
    Refresh
    ,对于手头的
    Invoke
    来说不是问题;)这(
    Refresh()
    )部分解决了我的问题。DGV更新,但总是落后一条记录(当我的表中有两条记录时,DGV中只有一条记录,即使在我的测量停止后,它仍保持不变)。我正在
    DataTable.TableNewRow
    事件中刷新DGV。。。不管怎样,谢谢,现在只需向上投票,因为我正试图找到更好的解决方案;)