我有一个数据网格,每3秒刷新一次,而刷新发生时,Datatable每次都会意外重置。我所做的是从一个数据表添加值到另一个数据表。
但是如果使用' 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
的情况下存储数据你能解释一下吗?
答案 0 :(得分:0)
如果我在下面使用之前只使用绑定数据,则上面的代码可以正常工作;
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方法中的第一个语句。
答案 1 :(得分:0)
你正在做的事是绝对没有必要的。当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所做的任何更改都将自动显示在网格中而不设置网格的数据源,顺便说一下,这是一项昂贵的操作,不应该每三秒钟完成一次。