2008-10-03 10 views
6

Ich erinnere mich, es gibt einen Unterschied zwischen einigen Methoden/Eigenschaften direkt in der DataTable Klasse aufgerufen, und die gleichnamige Methoden/Eigenschaften auf der DataTable.Rows Eigenschaft. (Könnte die RowCount/Count-Eigenschaft gewesen sein, für die ich das gelesen habe.) Der Unterschied ist einer von ihnen ignoriert DataRow.RowState, und der andere respektiert/verwendet es. In diesem speziellen Fall frage ich mich über den Unterschied zwischen DataTable.Clear und DataTable.Rows.Clear. Ich kann mir vorstellen, dass einer von ihnen tatsächlich alle Zeilen entfernt und der andere sie nur als gelöscht markiert.Gibt es einen Unterschied zwischen DataTable.Clear und DataTable.Rows.Clear?

Also meine Frage ist, gibt es einen Unterschied zwischen den beiden Clear-Methoden, und wenn ja, was ist der Unterschied?

(Oh, wird diese 1,1 btw .NET, falls die Semantik von einer Version auf eine andere geändert wird.)

Antwort

7

In .Net 1.1, DataRowCollection.Clear ruft DataTable.Clear

jedoch in .Net 2.0, gibt es einen Unterschied. Wenn ich die Quelle richtig verstehe, löscht DataTable.Clear nicht angefügten Zeilen (erstellt mit DataTable.NewRow), während DataRowCollection.Clear nicht.

Der Unterschied ist in RecordManager.Clear (Quelle unten, von .Net Reference Source für v3.5 SP 0); clearAll ist nur wahr, wenn von DataTable.Clear aufgerufen wird.

internal void Clear(bool clearAll) { 
     if (clearAll) { 
      for(int record = 0; record < recordCapacity; ++record) { 
       rows[record] = null; 
      } 
      int count = table.columnCollection.Count; 
      for(int i = 0; i < count; ++i) { 
       // 

       DataColumn column = table.columnCollection[i]; 
       for(int record = 0; record < recordCapacity; ++record) { 
        column.FreeRecord(record); 
       } 
      } 
      lastFreeRecord = 0; 
      freeRecordList.Clear(); 
     } 
     else { // just clear attached rows 
      freeRecordList.Capacity = freeRecordList.Count + table.Rows.Count; 
      for(int record = 0; record < recordCapacity; ++record) { 
       if (rows[record]!= null && rows[record].rowID != -1) { 
        int tempRecord = record; 
        FreeRecord(ref tempRecord); 
       } 
      } 
     } 
    } 
2

AFAIK, der Hauptunterschied zwischen datatable.clear und datatable.rows.clear, ist, dass beide datatable.clear Zeilen und Spalten löscht . Wenn Sie also die Tabellenstruktur (d. H. Spalten) beibehalten möchten, verwenden Sie datatable.rows.clear. Und wenn Sie von vorne anfangen möchten, verwenden Sie datatable.clear oder sogar datatable.reset, um direkt zum Anfang zurückzukehren.

datatable.reset ist effektiv die nächste Stufe von datatable.clear. Die Verwendung von datatable.clear wird fehlschlagen, wenn Beschränkungen angewendet werden, die verletzt würden, aber die Verwendung von datatable.reset wird alles und jeden, was seit der Erstellung der Datentabelle erstellt wurde, loswerden.

+0

Was Unterschied zwischen Klar wäre und Reset? – Tobi

+0

Das ist genau die Antwort, die ich gesucht habe, danke. :) Sie sind unkorrekt, dass '.Clear()' auch Spalten löscht; das ist jedoch nicht wahr. '.Reset()' tut. :) – Chiramisu

2

Ich glaube nicht, dass DataTable.Clear Spalten löscht. Dieser Code schreibt "1" auf Standardausgabe:

var d = new DataTable(); 
d.Columns.Add("Hello", typeof(string)); 
d.Clear(); 
Console.WriteLine(d.Columns.Count); 
+0

Es sei denn, es ist eine 1.1 Sache. Ich habe VS2003 nicht, um es mit zu prüfen. –

+0

Nein, ich habe es jetzt getestet und dieser Code schreibt auch "1" in die Standardausgabe in .NET 1.1/VS2003. – Tobi

-2

Die beiden machen das gleiche. Eine ist nur eine geerbte Methode aus der Collections-Klasse. Und die Table.Clear() ruft nur diese Methode auf.

+0

Sehen Sie sich die System.Data-Assembly mit Reflector an und Sie werden sehen, dass dies falsch ist. – Joe

4

Ich habe die verschiedenen Methoden jetzt in .NET 1.1/VS2003 getestet, scheint Matt Hamilton hat Recht.

  • DataTable.Clear und DataTable.Rows.Clear in Bezug auf die zwei Dinge verhalten sich identisch scheinen ich getestet: Sowohl entfernen Sie alle Zeilen (sie markieren sie nicht als gelöscht, sie sie wirklich aus der Tabelle entfernen) und entfernt die Spalten der Tabelle nicht.
  • DataTable.Reset löscht Zeilen und Spalten.
  • DataTable.Rows.Count enthält gelöschte Zeilen. (Dies könnte 1.1 spezifisch sein)
  • foreach iteriert über gelöschte Zeilen. (Ich bin mir ziemlich sicher, dass gelöschte Zeilen in 2.0 übersprungen werden.)
+0

Hurra! Testen! (im Gegensatz zu meiner Knie-Antwort, die ich seitdem gelöscht habe) –

0

Es gibt keinen Unterschied zwischen ihnen. DataRowCollection.Clear() ruft Table.Clear() auf

Table.Clear() überprüft, dass die Tabelle gelöscht werden kann (Einschränkungen können dies verhindern), entfernt die Zeilen und erstellt alle Indizes neu.

0

Do Below und seine absolut in Ordnung arbeiten ....

DataRow[] d_row = dt_result.Select("isfor_report='True'"); 
DataTable dt = dt_result.Clone();     
foreach (DataRow dr in d_row) 
{ 
    dt.ImportRow(dr); 
} 
gv_view_result.DataSource = dt; 
gv_view_result.DataBind(); 
Verwandte Themen