我有一个数据网格,每 3 秒刷新一次,而刷新发生时数据表每次都会意外重置。我所做的是将一个数据表中的值添加到另一个数据表中。
但是,如果使用“DefaultView.ToTable”,它会存储数据。
基本上,我有 2 个数据表 dtTopSQL 和 dtCurTopSQL。
dtTopSQL 获取新数据并添加到数据表 dtCurTopSQL,我想将行存储在 dtCurTopSQL 中;
// Initial Load the Datatable Structure
private void Main_Load(object sender, EventArgs e)
{
dtTopSQL.Columns.Add("SQL_ID", typeof(string));
dtTopSQL.Columns.Add("Count", typeof(Int16));
dtTopSQL.Columns.Add("CurTime", typeof(DateTime));
}
// Timer start refreshing the datagrid
private void timer_TimerTopSQL(object sender, EventArgs e)
{
dtTopSQL.Clear(); // Clear before the Fill
odaTopSQL = new OracleDataAdapter(getTopSQLString, oradb);
odaTopSQL.Fill(dtTopSQL);
getTopSQL();
}
// Merging datatable starts here.
public void getTopSQL()
{
for (int i = 0; i < dtTopSQL.Rows.Count; i++)
{
bool isDupe = false;
for (j = 0; j < dtCurTopSQL.Rows.Count; j++)
{
if (dtTopSQL.Rows[i][0].ToString() == dtCurTopSQL.Rows[j][0].ToString())
{
dtCurTopSQL.Rows[j][1] = int.Parse(dtCurTopSQL.Rows[j][1].ToString()) + int.Parse(dtTopSQL.Rows[i][1].ToString());
dtCurTopSQL.Rows[j][2] = CurDate;
isDupe = true;
break;
}
}
if (!isDupe)
{
dtCurTopSQL.ImportRow(dtTopSQL.Rows[i]);
dtCurTopSQL.Rows[j][2] = CurDate;
}
}
ugTopSQL.DataSource = dtCurTopSQL; // Bind the merged Datatable.
}
如果我在绑定数据之前使用下面的代码,上面的代码就可以工作;
dtCurTopSQL = dtCurTopSQL.DefaultView.ToTable();
但是我不明白为什么?我想在不使用 DefaultView.ToTable 的情况下存储数据
你能解释一下吗?
如果我在绑定数据之前使用下面的代码,上面的代码就可以工作;
dtCurTopSQL = dtCurTopSQL.DefaultView.ToTable();
但是我不明白为什么?我想在不使用的情况下存储数据 默认视图.ToTable
ugTopSQL.DataSource = dtCurTopSQL; // Bind the merged Datatable.
这条语句第一次执行时,DataSource从null变为dtCurTopSQL。每次后续执行时,DataSource 设置器都会检查新值是否与其现有值相同,如果是,则什么都不做。
通过在分配 DataSource 之前为 dtCurTopSQL 分配一个新表,您正在为 DataSource 分配一个新对象,因此它根据新源进行操作。
一个简单的解决方案是添加
ugTopSQL.DataSource = null;
作为 getTopSQL 方法中的第一条语句。
你所做的完全没有必要。当 UltraGrid 绑定到 DataTable 时,每次数据表的行发生变化时,网格将自动显示此变化。所以像这样改变你的 Load 事件:
// Initial Load the Datatable Structure
private void Main_Load(object sender, EventArgs e)
{
dtTopSQL.Columns.Add("SQL_ID", typeof(string));
dtTopSQL.Columns.Add("Count", typeof(Int16));
dtTopSQL.Columns.Add("CurTime", typeof(DateTime));
ugTopSQL.DataSource = dtCurTopSQL; // Bind the merged Datatable.
}
然后从 getTopSQL 方法中删除这一行:
ugTopSQL.DataSource = dtCurTopSQL; // Bind the merged Datatable.
这样,您对 dtCurTopSQL 所做的任何更改都将自动显示在网格中,而无需设置网格的数据源,顺便说一句,这是一项昂贵的操作,不应每三秒完成一次。
最好的解决方案是使用 DataTable.Select(_filter) 方法而不是 dataview/datatable.defaultview 等......如果你想停止 datagridview 自动重置。
谢谢