DataTable.Clear和DataTable.Rows.Clear之间有区别吗?

时间:2008-10-03 09:59:39

标签: .net

我记得在DataTable类上直接调用的某些方法/属性与DataTable.Rows属性上具有相同名称的方法/属性之间存在差异。 (可能是我读过这个的RowCount / Count属性。)区别在于其中一个忽略DataRow.RowState,而另一个则尊重/使用它。

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

所以我的问题是,两种Clear方法之间是否有区别,如果有,那有什么区别?

(哦,这是针对.NET 1.1 btw,以防语义从一个版本更改为另一个版本。)

7 个答案:

答案 0 :(得分: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);
                }
            } 
        }
    } 

答案 1 :(得分:4)

我一直在测试.NET 1.1 / VS2003中的不同方法,看来Matt Hamilton是对的。

  • DataTable.Clear和DataTable.Rows.Clear似乎在我测试的两件事情上表现相同:都删除了所有行(它们没有将它们标记为已删除,它们确实将它们从表中删除),并且都没有删除表格的列。
  • DataTable.Reset清除行和列。
  • DataTable.Rows.Count确实包含已删除的行。 (这可能是1.1特定的)
  • foreach迭代已删除的行。 (我很确定2.0中会删除已删除的行。)

答案 2 :(得分:2)

AFAIK是datatable.cleardatatable.rows.clear之间的主要区别,是datatable.clear清除行和列。因此,如果要保留表结构(即列),请使用datatable.rows.clear。如果您想从头开始,请使用datatable.clear,甚至datatable.reset直接回到开头。

datatable.reset实际上是datatable.clear的下一级别。如果存在任何可能违反的约束,则使用datatable.clear将失败,但使用datatable.reset将删除自创建数据表以来已放置的任何内容和所有内容。

答案 3 :(得分:2)

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

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

答案 4 :(得分:0)

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

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

答案 5 :(得分:-1)

在下面做,它的工作绝对正常....

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();

答案 6 :(得分:-2)

两者都做同样的事情。一个是Collections类的继承方法。 Table.Clear()只调用该方法。