C#DataGridView未使用DataTable更新
我有一个包含一些数据的DataTable,我使用以下代码将其与我的DataGridView绑定: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
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。。。不管怎样,谢谢,现在只需向上投票,因为我正试图找到更好的解决方案;)