重命名列并在加载数据后键入Datatable

时间:2012-06-26 15:30:30

标签: c# datatable asp.net-4.0

我从csv文件导入数据,有时会有列标题,有时不是客户选择自定义列(来自多个下拉列表)

我的问题是我能够更改列类型和名称,但是当我想将数据行导入克隆表时,它只是在这些行中添加行但没有数据。如果我将列重命名为旧值,它可以说列0名称为0如果我将其更改为我需要的其他东西它将不会用数据填充下面的行但如果我再次将零更改为零它将是任何想法:

这是我的编码:

 #region Manipulate headers

            DataTable tblCloned = new DataTable();
            tblCloned = tblDataTable.Clone();
            int i = 0;

            foreach (string item in lstRecord)
            {

                if (item != "Date")
                {
                    var m = tblDataTable.Columns[i].DataType;
                    tblCloned.Columns[i].DataType = typeof(System.String);
                    tblCloned.Columns[i].ColumnName = item;

                }
                else if(item == "Date")
                {
                    //get the proper date format
                    //FillDateFormatToColumn(tblCloned);
                    tblCloned.Columns[i].DataType = typeof(DateTime);
                    tblCloned.Columns[i].ColumnName = item;
                }

                i++;
            }

            tblCloned.AcceptChanges();


            foreach (DataRow row in tblDataTable.Rows)
            {                   
                tblCloned.ImportRow(row);
            }

            tblCloned.AcceptChanges();

            #endregion

在第二个foreach循环中,当它调用将数据导入克隆表时,它会添加空行。

经过几次尝试,我想出了这个有效的解决方案:

 foreach (DataRow row in tblDataTable.Rows)
            {
                int x = 0;
                DataRow dr = tblCloned.NewRow();

                foreach (DataColumn dt in tblCloned.Columns)
                {
                    dr[x] = row[x];
                    x++;
                }                       

                tblCloned.Rows.Add(dr);
                //tblCloned.ImportRow(row);
            }

但我会接受Scottie的答案,因为它毕竟是更少的代码。

1 个答案:

答案 0 :(得分:2)

而不是

foreach (DataRow row in tblDataTable.Rows)
{                   
  tblCloned.ImportRow(row);
}

foreach (DataRow row in tblDataTable.Rows)
{                   
  tblCloned.LoadDataRow(row.ItemArray, true);
}