我记得在DataTable类上直接调用的某些方法/属性与DataTable.Rows属性上具有相同名称的方法/属性之间存在差异。 (可能是我读过这个的RowCount / Count属性。)区别在于其中一个忽略DataRow.RowState,而另一个则尊重/使用它。
在这种特殊情况下,我想知道DataTable.Clear和DataTable.Rows.Clear之间的区别。我可以想象其中一个实际上删除了所有行,而另一个只是将它们标记为已删除。
所以我的问题是,两种Clear方法之间是否有区别,如果有,那有什么区别?
(哦,这是针对.NET 1.1 btw,以防语义从一个版本更改为另一个版本。)
答案 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是对的。
答案 2 :(得分:2)
AFAIK是datatable.clear
和datatable.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()只调用该方法。