数据表意外重置

时间:2017-01-28 13:12:56

标签: c# .net winforms datatable infragistics

我有一个数据网格,每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

的情况下存储数据

你能解释一下吗?

2 个答案:

答案 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所做的任何更改都将自动显示在网格中而不设置网格的数据源,顺便说一下,这是一项昂贵的操作,不应该每三秒钟完成一次。