更新DataTable中的值不起作用

时间:2013-04-24 15:08:00

标签: c# datatable

我有这样的代码:

DataTable dt = new DataTable();
// (...) getting data, displaying on DataGridView - all works fine

int columns = dt.Columns.Count; // getting column count

foreach (DataRow row in dt.Rows)
{
    for (int c = 0; c < columns; c++) // c is column index
    {
        // all old values are positive for debugging
        double oldVal = Convert.ToDouble(row.ItemArray[c]);

        // new values should become negative
        double newVal =  oldVal * -1;

        row.ItemArray[c] = newVal; // im trying to update value like this

        // THIS SHOWS POSITIVE NUMBERS (NOT UPDATED)
        this.Text = row.ItemArray[c].ToString(); // this is simple debug

    }
}

这有点复杂,我简化了代码。

为什么我的值不会更新?

稍后添加:

还有一件重要的事情。此数据来自数据库视图,而不是表。当然,我想在我的DataTable对象中更改该数据,而不是在数据库中。

2 个答案:

答案 0 :(得分:3)

最后这样做

dt.AcceptChanges();

这将提交自上次调用AcceptChanges()以来对此表所做的所有更改。

        DataTable dt = new DataTable();
        // (...) getting data, displaying on DataGridView - all works fine

        int columns = dt.Columns.Count; // getting column count

        foreach (DataRow row in dt.Rows)
        {
            foreach (DataColumn c in dt.Columns)
            {
                // all old values are positive for debugging
                double oldVal = Convert.ToDouble(row[c]);

                // new values should become negative
                double newVal = oldVal * -1;

                row[c] = newVal; // im trying to update value like this

                // THIS SHOWS POSITIVE NUMBERS (NOT UPDATED)
                this.Text = row[c].ToString(); // this is simple debug
            }
        }

        dt.AcceptChanges();
编辑(补充解释):

不跟踪对ItemArray元素的更改,因此数据表值

中不会反映任何更改

但是,您可以使用ItemArray一次更改所有行,如下所示:

dt.Rows[0].ItemArray = new object[] {"new value"};

在这种情况下,跟踪更改,并反映在数据表中。

答案 1 :(得分:1)

将您的foreach循环更新为

foreach (DataRow row in dt.Rows)
    {
        for (int c = 0; c < columns; c++) // c is column index
        {       
          double oldVal = Convert.ToDouble(row[c]);    

          double newVal = -oldVal;

          row[c] = newVal;    

          this.Text = row[c].ToString();     
       }
    }

或者您可以使用foreach代替for循环:

foreach (DataRow row in dt.Rows)
{
    foreach (DataColumn c in dt.Columns)
        {           
        double oldVal = Convert.ToDouble(row[c]);
        double newVal = -oldVal;
        row[c] = newVal;
        this.Text = row[c].ToString();   
       }
}