winforms 数据表意外重置

o7jaxewo  于 2023-04-12  发布在  其他
关注(0)|答案(3)|浏览(154)

我有一个数据网格,每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存储数据
你能解释一下吗?

cwxwcias

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方法中的第一条语句。

4smxwvx5

4smxwvx52#

你所做的是完全不必要的。当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所做的任何更改都将自动显示在网格中,而无需设置网格的DataSource,顺便说一下,这是一个昂贵的操作,不应该每三秒钟完成一次。

fcg9iug3

fcg9iug33#

最好的解决方案是使用DataTable。如果你想自动停止datagridview重置,请选择(_filter)方法而不是dataview/datatable.defaultview等。

相关问题