Developer
Developer

Reputation: 3057

Rename column and type in Datatable after data is loaded

I am importing data from csv file, sometimes there are column headers and some times not the customer chooses custom columns(from multiple drop downs)

my problem is I am able to change the columns type and name but when I want to import data row into cloned table it just adds rows but no data with in those rows. If I rename the column to old values it works, let's say column 0 name is 0 if I change that to something else which I need to it won't fill the row below with data but If I change zero to zero again it will any idea:

here is my coding:

 #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

in the second foreach loop when it calls to import data to cloned table it adds empty rows.

After couple of tries I came up with this solution which is working:

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

but I will accept Scottie's answer because it is less code after all.

Upvotes: 1

Views: 2544

Answers (1)

ScottieMc
ScottieMc

Reputation: 686

Instead of

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

try

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

Upvotes: 2

Related Questions