1

我有这样的代码:

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 对象中的数据,而不是数据库中的数据。

4

2 回答 2

4

最后这样做

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"};

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

于 2013-04-24T15:08:43.000 回答
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();   
       }
}
于 2013-04-24T15:14:23.207 回答