假设我有一个带有Color列的表。颜色可以有各种值。我有一个C#方法,可以一次处理给定列的项目。因此,我想:
foreach(colorname in mytable.getDistinctColornames)
monocolorMethod(mytable.getSubTableOnlyContainingRowsWithColor(colorname))
我如何优雅地做到这一点......?
不惜一切代价,我会避免将数据复制回来。向前。我想对数据表有点看法。一个只能“显示”给定列的行和“可写”视图的视图(即当我写入已过滤的子集时,原始表被写入)
编辑:
假设我有一个'Car'表,我想用'Color'替换所有'Color = Red'车型的'Type'栏中的'Sedan'。
如果给出以下代码,我该怎么做?
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();
答案 0 :(得分:2)
答案 1 :(得分:1)
您是否尝试使用DataView
课程?它看起来就像你想要实现的而不使用LINQ:http://msdn.microsoft.com/en-us/library/fdcwwhez
使用示例:
假设有一个名为DataTable
的{{1}}对象,其中包含4行:
_dt
您可以轻松创建DataView,它不会过滤数据,但会对其执行排序操作:
_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);
您还可以在_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();
中将有5行。编辑行也很简单:
_dt
您还可以使用DataView.Find()
或DataView.FindRows()
方法在var editedRow = _dv[0];
editedRow.BeginEdit();
editedRow["Name"] = "Test";
editedRow.EndEdit();
中找到一行。