2017-01-28 17 views
0

私は3秒ごとにリフレッシュするDataGridを持っています。リフレッシュ中にDatatableは毎回予期せずリセットされます。私がしているのは、あるデータテーブルの値を別のデータテーブルに追加することです。Datatableが予期せずリセットされる

ただし、 'DefaultView.ToTable'を使用すると、データが保存されます。

基本的には、dtTopSQLとdtCurTopSQLという2つのデータセットがあります。

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. 
    } 

上記のコードは、データをバインドする前に以下のコードを使用すると機能します。

​​

しかし、なぜ私は理解できませんか? DefaultView.ToTableを使用せずにデータを保存したい

お願いします。

答えて

0

上記のコードは、データをバインドする前に以下のコードを使用すると機能します。

dtCurTopSQL = dtCurTopSQL.DefaultView.ToTable();

しかし、私はなぜ理解していませんか?私はDefaultView.ToTable

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

この文が実行された最初の時間を を使用せずにデータを格納したい、ヌルからdtCurTopSQLへのデータソースの変更。それが実行されるたびに、DataSourceセッターは新しい値が既存の値と同じかどうかをチェックし、そうであれば何もしません。

DataSourceを割り当てる前にdtCurTopSQLに新しいテーブルを割り当てることによって、DataSourceに新しいオブジェクトを割り当てているため、新しいソースに従って動作します。

簡単な解決策はgetTopSQLメソッドの最初のステートメントとして

ugTopSQL.DataSource = null;

を追加することです。

+0

回答ありがとうございます。しかし、それは動作しませんでした。 –

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に対して行った変更は自動的にグリッドのDataSourceを設定せずに、グリッドに表示されますどのようなこの道をこれは高価な操作であり、3秒ごとに行うべきではありません。

+0

こんにちは、お返事ありがとうございます。しかしそれは何も返さない。 –

+0

何も返されません。 – wnvko

+0

データソースはバインドされていません。グリッドは何も表示しません。 –

関連する問題