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(); }));
}