Изменение строк DataTable в цикле не сохраняет изменения - PullRequest
0 голосов
/ 05 января 2012

У меня есть код ниже, который пытается изменить каждую строку в DataTable, но после цикла по строкам, где происходит изменение, когда я смотрю на коллекцию строк, столбец LOCATION пуст, хотя цикл только что заполнил его. Кто-нибудь может помочь?

        dtBoxes.Columns.Add("LOCATION");

        dtBoxes.DefaultView.Sort = "PALLETID";
        foreach (DataRow row in dtBoxes.DefaultView.ToTable().Rows)
        {
            var locationRow = dtLocations.Select("ID = " + row["ID"].ToString());
            if (locationRow != null)
            {
                row["LOCATION"] = locationRow.First()["LOCATION"].ToString();
            }
        }

Ответы [ 3 ]

0 голосов
/ 05 января 2012

dtBoxes.Columns.Add ("LOCATION");

    dtBoxes.DefaultView.Sort = "PALLETID";
    foreach (DataRow row in dtBoxes.DefaultView.ToTable().Rows)
    {
        var locationRow = dtLocations.Select("ID = " + row["ID"].ToString());
        if (locationRow != null)
        {
            row["LOCATION"] = locationRow.First()["LOCATION"].ToString();
        }
    }


dtBoxes.UpdateChanges() // Add this line and check
0 голосов
/ 20 января 2014

Если вы используете DataTable, вам нужно взять другой DataTable, а затем вам нужно перебрать все ячейки в таблице данных, как показано в коде. Мы не можем изменять строки в той же таблице, потому что это вызовет исключение, говорящее «Сборник был изменен ". Нам нужно взять новую таблицу данных.

Рассмотрим следующий код.

     //To get the result with leading zero's in excel this code is written.
    DataTable dtUpdated=new DataTable();
    //This gives similar schema to the new datatable
    dtUpdated = dtReports.Clone();
        foreach (DataRow row in dtReports.Rows)
        {
            for (int i = 0; i < dtReports.Columns.Count; i++)
            {
                string oldVal = row[i].ToString();
                string newVal = "&nbsp;"+oldVal;
                row[i] = newVal;
            }
            dtUpdated.ImportRow(row); 
        }

Предположим, что в приведенном выше коде к тексту всехячейки, беря новые данные.

0 голосов
/ 05 января 2012

Я не знаю много о DataViews, но я бы предположил, что ToTable() создает новые экземпляры строк.

Попробуйте изменить цикл на

foreach (DataRowView row in dtBoxes.DefaultView)
{
    //....
}
...