我有一个数据网格,每3秒刷新一次,每次刷新时,数据表都会意外地重置。我所做的就是将一个数据表的值添加到另一个数据表。
但是,如果使用“DefaultView.ToTable”,它将存储数据。
基本上,我有两个数据表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存储数据
你能解释一下吗?
3条答案
按热度按时间cwxwcias1#
上面的代码工作,如果我使用下面之前只是绑定数据;
dtCurTopSQL = dtCurTopSQL.DefaultView.ToTable();
但是我不明白为什么?我想不使用DefaultView.ToTable存储数据
ugTopSQL.DataSource = dtCurTopSQL; // Bind the merged Datatable.
第一次执行此语句时,DataSource从null更改为dtCurTopSQL。每次执行此语句时,DataSource setter都会检查新值是否与其现有值相同,如果相同,则不执行任何操作。
通过在分配DataSource之前将新表分配给dtCurTopSQL,您将向DataSource分配一个新对象,因此它将根据新源进行操作。
一个简单的解决方案是添加
ugTopSQL.DataSource = null;
作为getTopSQL方法中的第一条语句。
4smxwvx52#
你所做的是完全不必要的。当UltraGrid绑定到DataTable时,每次数据表的行发生更改,网格都会自动显示此更改。因此,像这样更改Load事件:
然后从getTopSQL方法中删除此行:
这样,您对dtCurTopSQL所做的任何更改都将自动显示在网格中,而无需设置网格的DataSource,顺便说一下,这是一个昂贵的操作,不应该每三秒钟完成一次。
fcg9iug33#
最好的解决方案是使用DataTable。如果你想自动停止datagridview重置,请选择(_filter)方法而不是dataview/datatable.defaultview等。