C# DataGridView在TabControl中从Datatable中丢失一行

C# DataGridView在TabControl中从Datatable中丢失一行,c#,datagridview,datatable,C#,Datagridview,Datatable,我有一个应用程序,它使用DataGridView和DataTable作为数据源。我创建DataTable,填充行,并在启动时将DataGridView的Datasource设置为DataTable。像这样 aData.Columns.Add("Description", typeof(string)); aData.Columns.Add("OID", typeof(string)); aData.Columns.Add("Value", type

我有一个应用程序,它使用
DataGridView
DataTable
作为数据源。我创建
DataTable
,填充行,并在启动时将
DataGridView的
Datasource设置为
DataTable
。像这样

        aData.Columns.Add("Description", typeof(string));
        aData.Columns.Add("OID", typeof(string));
        aData.Columns.Add("Value", typeof(string));
        aData.Rows.Add(new object[] { "Row 1", 0, null });
        aData.Rows.Add(new object[] { "Row 2", 1, null });
        aData.AcceptChanges();
        dgTest.DataSource = aData;
我有一个线程,它执行并触发一个事件,该事件将更新
DataTable

在您开始在
选项卡页面
之间切换之前,所有操作都可以正常工作,
数据网格
会丢失其中一行。如果单击列标题对行进行排序,则它会弹出。但是,在
选项卡页面
之间切换,它会再次消失

如果对DataGrid进行互操作,Rows属性仅显示1行,但
DataTable
仍显示2行


我有点困惑为什么会发生这种情况,如果有什么我做错了。我添加了一个具有相同行为的示例应用程序

您需要从UI线程调用
AcceptChanges
。对代码进行下一次更改:

// aData.AcceptChanges(); <- change this to the code below inside your OnResult event
this.BeginInvoke(new Action(() => { aData.AcceptChanges(); }));

嗯,真奇怪。。我在一个简单的应用程序中尝试了您的代码片段,在遍历选项卡时不会丢失任何行。你能在tab changed事件上添加一个dgTest.Update(),这样我们就可以确保重新绘制UI了吗?@Gnqz代码示例确实重现了这个问题,只是它并不总是可靠的,需要多次尝试。如果你将
Thread.Sleep(1)
更改为
Thread.Sleep(3000)
中的
Class1.cs
则更容易复制。打开表单,您将看到值未填充。如果你在它们之前来回交换,问题就会发生。一旦它们被填充,问题直到几次尝试之后才会出现。
线程.Sleep(1)
实际上是
SnmpV1Packet result=(SnmpV1Packet)target.Request(pdu,param)我刚放了Thread.Sleep(1)来替换代码谢谢。因为
DataTable
没有调用,所以我认为它可能不需要它。我在其他控件上使用invoke,因为如果我不能在类上使用
BeginInvoke
,就会出现跨线程错误。所以我只使用
this.Invoke(新操作(()=>snmpInfo.ValueControl.AcceptChanges())。对于任何可能有同样问题的人
void rm_OnResult(int Row, int Value)
{
    DataRow[] dr;

    dr = aData.Select("OID = '" + Row + "'");
    dr[0]["Value"] = Value.ToString("#,###.00");
    this.BeginInvoke(new Action(() => { aData.AcceptChanges(); }));
}