2016-01-21 4 views
2

Я хочу, чтобы удалить ненужные столбцы из DataTable и организовать порядок столбцов в заранее определенном порядкеDataTable удалить столбцы и изменить порядок столбцов

Например, мои столбцы таблицы, как показано ниже,

Col2|Col1|Col3|Test|Test1|Col5|Col4|Some col name|Col6 

Я хочу удалить тест, Test1 и Some имя Col и перегруппировки по DataTable в формате ниже

Col1|Col2|Col3|Col4|Col5|Col6 

// I need the below columns 
List<string> tableColumns = new List<string>(); 
tableColumns.Add("Col1"); 
tableColumns.Add("Col2"); 
tableColumns.Add("Col3"); 
tableColumns.Add("Col4"); 
tableColumns.Add("Col5"); 
tableColumns.Add("Col6"); 

List<DataColumn> tblColumns = MyDataTable.Columns.Cast<DataColumn>().ToList(); 

//Remove unwanted columns 
foreach (DataColumn col in tblColumns) 
{ 
    if (!tableColumns.Contains(col.ColumnName.Trim())) 
    { 
    MyDataTable.Columns.Remove(col); 
    } 
} 

Теперь, как я изменить порядок столбцов в указанном ниже порядке?

Col1|Col2|Col3|Col4|Col5|Col6 

Я попытался, как в коде ниже, но он терпит неудачу, если все элементы в tableColumns не существует в DataTable. Кроме того, некоторые названия раз данные столбцов таблицы имеют некоторое пустое пространство (например, «col1»)

foreach (var col in tableColumns) 
{ 

    MyDataTable.Columns[col].SetOrdinal(tableColumns.IndexOf(col)); 

} 

Что является лучшим способом для удаления ненужных столбцов и переставить столбцы?

ответ

3

После удаления ненужных столбцов, вот как вы можете их заказать:

int index = 0; 

foreach (var col in 
    MyDataTable.Columns 
    .Cast<DataColumn>() 
    .OrderBy(x => tableColumns.IndexOf(x.ColumnName)) 
    .ToList()) 
{ 
    col.SetOrdinal(index); 
    index ++; 
} 

Это выбирает столбцы из DataTable, и упорядочивает их по их соответствующему индексу в tableColumns списке.

Затем он вызывает SetOrdinal на каждом из них, каждый раз увеличивая индекс.

+0

Это работает для меня, спасибо большое! – blue

+0

Добро пожаловать –

0

Я думаю, что ваши столбцы могут иметь случайный порядок, например Col2, Col1, Col3. И вы хотите изменить и удалить ненужные столбцы, такие как Col1, Col2, Col3.

string[] srr = new string[]{"Col2","Col1","Col3","Test","Test1","Col6","Col4","Some col name","Col5"}; 

DataTable MyDataTable = new DataTable(); 

foreach(string col in srr) 
{ 
    MyDataTable.Columns.Add(col);    
} 

List<string> arrayNames = (from DataColumn x in MyDataTable.Columns 
         select x.ColumnName).ToList(); 

foreach(var col in arrayNames) 
{ 
    if(!col.Contains("Col")) 
    { 
     MyDataTable.Columns.Remove(col);    
    } 
    else 
    { 
     int result = Convert.ToInt32(Regex.Match(col.ToString(), @"\d+$").Value); 
     MyDataTable.Columns[col].SetOrdinal(result-1);   
    } 
} 

Это приведет к удалению столбцов, таких как Test, Test1, some col name ie. столбцы, которые не имеют слова «Col» (измените логику в соответствии с вашей программой). Затем, используя регулярное выражение, он будет извлекать числа из имен столбцов. т.е. 1 от «Col1», а затем переставить столбцы в соответствии с ним.

Смежные вопросы