假设我有一个带有颜色列的表。颜色可以具有各种值。我有一个 C# 方法,可以一次处理给定列的项目。因此,我想:
foreach(colorname in mytable.getDistinctColornames)
monocolorMethod(mytable.getSubTableOnlyContainingRowsWithColor(colorname))
我该如何优雅地做到这一点...?
无论如何,我都会避免来回复制数据。我想要对数据表的某种看法。一个只会"显示"给定列的行的视图和一个"可写"视图(即当我写入过滤的子集时,原始表被写入)
编辑:
假设我有一个"汽车"表,我想将所有汽车的"类型"列中的"轿车"替换为"卡车",并用"颜色=红色"。
给定以下代码,我将如何做?
DataTable cars (...); // the data
DataView dv = cars.DefaultView;
dv.RowFilter = "Color='Red'";
<在这里,我想循环使用DataView>。以下代码不起作用:
foreach (row in dv.AsEnumerable)
{
if(row["Type"] == "Sedan")
row["Type"] = "Truck";
}
编辑 2 :
发现这个 http://msdn.microsoft.com/fr-fr/library/system.data.dataview.allowedit.aspx 建议
view.AllowEdit = true;
view[0].BeginEdit();
view[0]["FirstName"] = "Mary";
view[0]["LastName"] = "Jones";
view[0].EndEdit();
看看这个:
查询数据集 – LINQ to DataSet 简介
你试过使用DataView
类吗?它看起来正是您希望在不使用 LINQ: 的情况下实现的目标:http://msdn.microsoft.com/en-us/library/fdcwwhez
用法示例:
假设有一个名为 _dt
的DataTable
对象,其中有 4 行:
_dt = new DataTable("") {Columns = {new DataColumn("ID"), new DataColumn("Name"), new DataColumn("Order")}};
_dt.Rows.Add(1, "one", 1);
_dt.Rows.Add(2, "two", 3);
_dt.Rows.Add(3, "three", 2);
_dt.Rows.Add(4, "four", 5);
您可以轻松创建不过滤数据但对其执行排序操作的 DataView:
_dv = new DataView(_dt, "", "Order, Name", DataViewRowState.CurrentRows);
您还可以将新行添加到DataView
中,并且由于它是在相应的DataTable
上设置的,因此新行将直接添加到_dt
对象中。排序顺序也将更新,新行不会是DataView
中的最后一个行(因为排序是在"顺序"和"名称"列上完成的)
var newRow = _dv.AddNew();
newRow["ID"] = 5;
newRow["Name"] = "five";
newRow["Order"] = 4;
newRow.EndEdit();
在该代码之后,_dt
将有 5 行。编辑行也非常简单:
var editedRow = _dv[0];
editedRow.BeginEdit();
editedRow["Name"] = "Test";
editedRow.EndEdit();
您还可以使用 DataView.Find()
或 DataView.FindRows()
方法在DataView
中查找行。