1

I have a Datatable. For example :

private DataTable GetGenericDatatable(){
    DataTable retval = new DataTable();
    retval.Columns.Add("ProtocolNumber");
    retval.Columns.Add("Name");
    retval.Columns.Add("Company");
    retval.Columns.Add("Department");
    retval.Columns.Add("VisitDate");
    retval.Columns.Add("DispatchTargetName");
    retval.Columns.Add("DayOffCount");
    // add data ...
    return retval;
}

I want to insert some columns between "Department" and "VisitDate" columns dynamically even the datatable is full with data.

We can do this by creating new datatable, creating the columns again etc. but it is a dirty solution. Any idea for a clear solution?

Tim Schmelter
  • 450,073
  • 74
  • 686
  • 939
obayhan
  • 1,636
  • 18
  • 35
  • Please look at this post. http://stackoverflow.com/questions/12937516/datatable-column-reorder – Raghu Aug 26 '14 at 08:37
  • @Raghu Yes, it looks good but sometimes inserted columns count may be over 30+, and rewrite 30+ columns again sounds not good. – obayhan Aug 26 '14 at 10:04

3 Answers3

1

Add a new DataColumn and use the SetOrdinal method to set its position:

var col = retval.Columns.Add("New Column");
col.SetOrdinal(4);
sloth
  • 99,095
  • 21
  • 171
  • 219
1

You can assign a DefaultValue to the DataColumm:

DataTable tbl = GetGenericDatatable();
tbl.Columns.Add(new DataColumn("Col1") { DefaultValue="def. value"});
tbl.Columns.Add(new DataColumn("Col2", typeof(DateTime)) { DefaultValue = DateTime.Now });

This value will be applied to every existing row in the table.

You can use SetOrdinal to set the index of a column. For example:

tbl.Columns["Col1"].SetOrdinal(tbl.Columns.IndexOf("VisitDate"));
tbl.Columns["Col2"].SetOrdinal(tbl.Columns.IndexOf("VisitDate"));

Now the new columns are between Department and VisitDate, Col1 before Col2.

Tim Schmelter
  • 450,073
  • 74
  • 686
  • 939
1

You could use this Extension:

namespace System
{
    public static class Extensions
    {
        public static void AddColumnAfter(this DataColumnCollection columnCollection, string afterWhichColumn, DataColumn column)
        {
            var columnIndex = columnCollection.IndexOf(afterWhichColumn);
            columnCollection.Add(column);
            columnCollection[column.ColumnName].SetOrdinal(columnIndex + 1);
        }
    }
}

Example:

 DataTable table = new DataTable();
 table.Columns.Add("Column 1");
 table.Columns.Add("Column 2");
 table.Columns.Add("Column 3");
 table.Columns.AddColumnAfter("Column 1", new DataColumn("Column 4"));
Raghu
  • 699
  • 7
  • 14