如何在数据表中编辑一行

30

我创建了一个数据表格,它有3列产品编号产品名称产品价格

    Datatable table= new DataTable("Product");

    table.Columns.Add("Product_id", typeof(int));
    table.Columns.Add("Product_name", typeof(string));
    table.Columns.Add("Product_price", typeof(string));

    table.Rows.Add(1, "abc", "100");
    table.Rows.Add(2, "xyz", "200");

现在我想通过索引查找并更新该行。

比如说

我想将 Product_name 列的值更改为“cde”,其 Product_id 列的值为 2。


请编辑您的问题,包括您已经尝试过的代码。谢谢。 - Wim Ombelets
7个回答

87

首先,您需要找到id == 2的行,然后更改名称如下:

foreach(DataRow dr in table.Rows) // search whole table
{
    if(dr["Product_id"] == 2) // if id==2
    {
        dr["Product_name"] = "cde"; //change the name
        //break; break or not depending on you
    }
}

您也可以尝试以下解决方案:
table.Rows[1]["Product_name"] = "cde" // not recommended as it selects 2nd row as I know that it has id 2

或者:

DataRow dr = table.Select("Product_id=2").FirstOrDefault(); // finds all rows with id==2 and selects first or null if haven't found any
if(dr != null)
{
    dr["Product_name"] = "cde"; //changes the Product_name
}

我喜欢“在DataTable上选择”的方法,因为循环遍历几千行会更慢。我还研究了“FirstOrDefault()”方法。如果您正在轮询ID字段,则最有可能正在寻找单个行。添加“FirstOrDefault()”方法比不带它的选择更快吗? - Dave Hampel
只是想提一下,在表格示例中,“Select”缺少方括号。应该写成DataRow[] dr = - Dave Hampel
@DaveHampel的FirstOrDefault()应该返回null或单行,因此是DataRow。DataRow[]意味着我们期望一个DataRow对象数组。另一方面,如果您删除了FirstOrDefault()(正如您在第一条评论中建议的那样),则需要DataRow[],因为Select返回类型是DataRow[]。 - Tafari

20

你可以使用

find

函数找到那一行。

DataRow row = table.Select("Product_id=2").FirstOrDefault();

并更新它

row["Product_name"] = "cde";

2
尽管这对 OP 的问题有效,但请注意,如果选择返回多个记录,则此解决方案仅更新第一条记录。 - AaA
1
这个解决方案非常好,正如AaA所说,它只适用于第一个结果,但是如果您正在查找数据表上的唯一值,则应该按预期工作。 - Cesar Duran

10

尝试使用 SetField 方法:

通过传递列对象:

table.Rows[rowIndex].SetField(column, value);

通过传递列索引:

table.Rows[rowIndex].SetField(0 /*column index*/, value);

通过将列名作为字符串传递:

table.Rows[rowIndex].SetField("product_name" /*columnName*/, value);

8
如果你的数据集过大,首先可以通过Select()方法选择所需的行,这将停止进一步的循环。
DataRow[] selected = table.Select("Product_id = 2")

然后循环遍历子集并进行更新

    foreach (DataRow row in selected)
    {
        row["Product_price"] = "<new price>";
    }

2
你可以像下面这样遍历 DataTable 并设置值。
foreach(DataTable thisTable in dataSet.Tables)
{
    foreach(DataRow row in thisTable.Rows)
    {
        row["Product_name"] = "cde";
    }
}

或者

thisTable.Rows[1]["Product_name"] = "cde";

希望这有所帮助。

没错,我们可以添加一个条件来验证数据,只有在验证通过后才进行更新...第二种方法针对特定行执行此操作。 - Zahir Khan

2

试一试,我也不确定百分之百正确。

        for( int i = 0 ;i< dt.Rows.Count; i++)
        {
           If(dt.Rows[i].Product_id == 2)
           {
              dt.Rows[i].Columns["Product_name"].ColumnName = "cde";
           }
        }

0

试试这个,

foreach(DataRow rw in dt.Rows)
{
rw["Obj_Amt"] = h.Decrypt(rw["Obj_Amt"].ToString());
dt.AcceptChanges();
rw.SetModified();
}

使用SetModified()方法来更新数据表的值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接