2017-01-28 16 views
0

Ich habe ein Datagrid, das alle 3 Sekunden aktualisiert und während der Aktualisierung geschieht Datatable wird jedes Mal unerwartet zurückgesetzt. Was ich tue, ist das Hinzufügen von Werten von einer Datentabelle zu einer anderen.Datatable wird unerwartet zurückgesetzt

Wenn jedoch 'DefaultView.ToTable' verwendet wird, werden die Daten gespeichert.

Grundsätzlich habe ich 2 Databases dtTopSQL und dtCurTopSQL.

dtTopSQL neue Daten erhalten und zu der Datentabelle dtCurTopSQL hinzufügen und ich möchte die Zeilen in dtCurTopSQL speichern;

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

obige Code funktioniert, wenn ich unten verwenden, bevor nur die Datenbindung;

dtCurTopSQL = dtCurTopSQL.DefaultView.ToTable(); 

Allerdings verstehe ich nicht warum? Ich möchte Daten speichern, ohne DefaultView.ToTable zu verwenden

Könnten Sie bitte erklären?

Antwort

0

Der obige Code funktioniert, wenn ich unten verwende, bevor nur Daten binden;

dtCurTopSQL = dtCurTopSQL.DefaultView.ToTable();

aber ich verstehe nicht, warum? Ich möchte Daten speichern, ohne dass die Datasource ändert sich von null auf dtCurTopSQL mit DefaultView.ToTable

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

ersten Mal in dieser Anweisung ausgeführt wird. Bei jeder weiteren Ausführung überprüft der DataSource-Setter, ob der neue Wert dem vorhandenen Wert entspricht. Ist dies der Fall, wird nichts unternommen.

Durch die Zuweisung einer neuen Tabelle zu dtCurTopSQL vor der Zuweisung der DataSource weisen Sie der DataSource ein neues Objekt zu, so dass es entsprechend der neuen Quelle agiert.

wäre eine einfache Lösung

ugTopSQL.DataSource = null;

als erste Anweisung in der getTopSQL Methode hinzuzufügen sein.

+0

Danke für die Antwort. Es hat jedoch nicht funktioniert. –

0

Was Sie tun, ist absolut unnötig. Wenn UltraGrid jedes Mal an DataTable gebunden wird, wenn sich die Zeilen der Datentabelle ändern, zeigt das Raster automatisch diese Änderung an. So Ereignis ändern Ihre Ladung wie folgt aus:

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

Dann entfernen Sie diese Zeile aus getTopSQL Methode:

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

Auf diese Weise unabhängig von Änderungen, die Sie zu dtCurTopSQL gemacht automatisch im Raster angezeigt wird, ohne das Netz der Datasource-Einstellung Das ist übrigens eine teure Operation und sollte nicht alle drei Sekunden gemacht werden.

+0

Hallo, danke für die Antwort. aber es gibt nichts zurück. –

+0

Was gibt nichts zurück? – wnvko

+0

Datenquelle nicht bindend. Raster zeigen nichts. –

Verwandte Themen