0

假设我有一个带有颜色列的表。颜色可以有不同的值。我有一个可以一次处理给定列的项目的 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();
4

2 回答 2

2

看看这个:

查询数据集——LINQ to DataSet 简介

于 2012-07-04T17:44:05.697 回答
1

您是否尝试过使用DataView类?它看起来正是您想要在不使用 LINQ 的情况下实现的目标:http: //msdn.microsoft.com/en-us/library/fdcwwhez

使用示例:

假设有一个DataTable名为_dt4 行的对象:

_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(因为排序是在 Order 和 Name 列上完成的)

var newRow = _dv.AddNew();
newRow["ID"] = 5;
newRow["Name"] = "five";
newRow["Order"] = 4;
newRow.EndEdit();

在该代码之后将有 5 行_dt。编辑行也很简单:

var editedRow = _dv[0];
editedRow.BeginEdit();
editedRow["Name"] = "Test";
editedRow.EndEdit();

您还可以使用DataView.Find()orDataView.FindRows()方法在DataView.

于 2012-07-04T17:46:00.457 回答