【问题标题】:Datatable gets reset unexpectedly数据表意外重置
【发布时间】:2017-01-28 13:12:55
【问题描述】:

我有一个数据网格,它每 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 的情况下存储数据

你能解释一下吗?

【问题讨论】:

    标签: c# .net winforms datatable infragistics


    【解决方案1】:

    如果我在绑定数据之前使用下面的代码,上面的代码就可以工作;

    dtCurTopSQL = dtCurTopSQL.DefaultView.ToTable();

    但是我不明白为什么?我想在不使用的情况下存储数据 DefaultView.ToTable

    ugTopSQL.DataSource = dtCurTopSQL; // Bind the merged Datatable.

    第一次执行此语句时,DataSource 从 null 更改为 dtCurTopSQL。每次后续执行时,DataSource 设置器都会检查新值是否与其现有值相同,如果相同则不执行任何操作。

    通过在分配 DataSource 之前为 dtCurTopSQL 分配一个新表,您正在为 DataSource 分配一个新对象,因此它与新源一致。

    一个简单的解决方案是添加

    ugTopSQL.DataSource = null;

    作为 getTopSQL 方法中的第一条语句。

    【讨论】:

      【解决方案2】:

      你正在做的事情是完全没有必要的。当 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,顺便说一下,这是一项昂贵的操作,不应每三秒完成一次。

      【讨论】:

      • 嗨,感谢您的回答。但是它什么也没返回。
      • 什么都不返回?
      猜你喜欢
      • 2016-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多