2008-10-03 126 views
6

我记得在DataTable类上直接调用的某些方法/属性与DataTable.Rows属性上名称相同的方法/属性之间存在差异。 (可能是我阅读过的RowCount/Count属性。)区别是其中一个无视DataRow.RowState,其他方面/使用它。DataTable.Clear和DataTable.Rows.Clear之间有区别吗?

在这种特殊情况下,我想知道DataTable.ClearDataTable.Rows.Clear之间的区别。我可以想象其中一个实际上删除所有行,另一个只是将它们标记为已删除。

所以我的问题是,是否有两个Clear方法之间的差异,如果有的话有什么区别?

(哦,这是为NET 1.1顺便说一句,如果语义从一个版本改变为另一个。)

回答

7

在NET 1.1,DataRowCollection.Clear调用DataTable.Clear

然而,在NET 2.0,是有区别的。 如果我正确理解源代码,DataTable.Clear将清除未连接的行(使用DataTable.NewRow创建),而DataRowCollection.Clear不会。

区别在于RecordManager.Clear(源代码下面,来自.Net Reference Source v3.5 SP 0); clearAll仅当从DataTable.Clear调用时才为真。

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,datatable.cleardatatable.rows.clear之间的主要区别是,datatable.clear清除行和列。所以如果你想保留表格结构(即列),使用datatable.rows.clear。如果您想从头开始,请使用datatable.clear或甚至datatable.reset直接返回到开头。

datatable.reset实际上是从datatable.clear上一级。使用datatable.clear将会失败,如果有任何违规应用的限制,但使用datatable.reset将摆脱自从创建数据表以来已经存在的所有内容。

+0

什么是清除并重置之间的区别? – Tobi 2008-10-03 10:11:24

+0

这正是我正在寻找的答案,谢谢。 :)你不正确,`。清除()清除列以及;不过,`.Reset()`确实如此。 :) – Chiramisu 2013-04-09 19:06:23

2

我不相信DataTable.Clear会清除列。此代码将“1”写入标准输出:

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

除非它是一个1.1的东西。我没有VS2003来测试它。 – 2008-10-03 10:28:42

+0

不,我实际测试它,现在这个代码也在.NET 1.1/VS2003的标准输出中写入“1”。 – Tobi 2008-10-03 11:02:40

-2

两者都执行相同的操作。一个只是Collections类的继承方法。 Table.Clear()只是调用该方法。

4

我一直在测试.NET 1.1/VS2003中的不同方法,似乎马特汉密尔顿是正确的。

  • DataTable.Clear和DataTable.Rows.Clear似乎对于行为等同于我测试了两件事情:既删除所有行(他们并不将其标记为删除,他们真正从表中删除) ,并且不删除表格的列。
  • DataTable.Reset清除行和列。
  • DataTable.Rows.Count包含已删除的行。 (这可能是1.1具体)
  • foreach迭代已删除的行。 (我敢肯定删除的行在2.0中被跳过。)
0

它们之间没有任何区别。 DataRowCollection.Clear()调用Table.Clear()

Table.Clear()检查表可以被清除(约束可以防止这种情况),删除行并重建任何索引。

0

下面做与精美绝伦的工作....

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(); 
相关问题