DataTable.Clear和DataTable.Rows.Clear之间有区别吗?
我记得在DataTable类上直接调用的某些方法/属性与DataTable.Rows属性上名称相同的方法/属性之间存在差异。 (可能是我阅读过的RowCount/Count属性。)区别是其中一个无视DataRow.RowState,其他方面/使用它。DataTable.Clear和DataTable.Rows.Clear之间有区别吗?
在这种特殊情况下,我想知道DataTable.Clear和DataTable.Rows.Clear之间的区别。我可以想象其中一个实际上删除所有行,另一个只是将它们标记为已删除。
所以我的问题是,是否有两个Clear方法之间的差异,如果有的话有什么区别?
(哦,这是为NET 1.1顺便说一句,如果语义从一个版本改变为另一个。)
在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);
}
}
}
}
AFAIK,datatable.clear
和datatable.rows.clear
之间的主要区别是,datatable.clear
清除行和列。所以如果你想保留表格结构(即列),使用datatable.rows.clear
。如果您想从头开始,请使用datatable.clear
或甚至datatable.reset
直接返回到开头。
datatable.reset
实际上是从datatable.clear
上一级。使用datatable.clear
将会失败,如果有任何违规应用的限制,但使用datatable.reset
将摆脱自从创建数据表以来已经存在的所有内容。
我不相信DataTable.Clear会清除列。此代码将“1”写入标准输出:
var d = new DataTable();
d.Columns.Add("Hello", typeof(string));
d.Clear();
Console.WriteLine(d.Columns.Count);
除非它是一个1.1的东西。我没有VS2003来测试它。 – 2008-10-03 10:28:42
不,我实际测试它,现在这个代码也在.NET 1.1/VS2003的标准输出中写入“1”。 – Tobi 2008-10-03 11:02:40
两者都执行相同的操作。一个只是Collections类的继承方法。 Table.Clear()只是调用该方法。
我一直在测试.NET 1.1/VS2003中的不同方法,似乎马特汉密尔顿是正确的。
- DataTable.Clear和DataTable.Rows.Clear似乎对于行为等同于我测试了两件事情:既删除所有行(他们并不将其标记为删除,他们真正从表中删除) ,并且不删除表格的列。
- DataTable.Reset清除行和列。
- DataTable.Rows.Count包含已删除的行。 (这可能是1.1具体)
- foreach迭代已删除的行。 (我敢肯定删除的行在2.0中被跳过。)
它们之间没有任何区别。 DataRowCollection.Clear()调用Table.Clear()
Table.Clear()检查表可以被清除(约束可以防止这种情况),删除行并重建任何索引。
下面做与精美绝伦的工作....
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();
什么是清除并重置之间的区别? – Tobi 2008-10-03 10:11:24
这正是我正在寻找的答案,谢谢。 :)你不正确,`。清除()清除列以及;不过,`.Reset()`确实如此。 :) – Chiramisu 2013-04-09 19:06:23