2014-06-18 4 views
1

내가 가진이 DataTable계산 된 열에서 사용되는 데이터 테이블에서 열을 제거하는 방법?

FName LName Tag1 Tag2 Tag3 ... (not fixed, can be as many) 내가

FName LName TagAll

그래서, 내가 그래서

var expression = string.Empty; 
// ... other code 
// In a loop for all tag columns 
expression = expression + " + ',' + " + tagColumn; 
// at the end of loop 
dtContact.Columns["Tag_All"].Expression = expression; 

같은 표정으로 열을 유형 stringTagAll을 만들어 원하는 것은

, 3 열이있는 경우 ex Pression의 데이터가 예를 들어이

"Tag1 + ',' + Tag2 + ',' + Tag3"

처럼

결과 DataTable 같이된다
FName LName Tag1 Tag2 Tag3 
Jeff Atwood test tag  other 
Matt breeden myTag total last 

FName LName Tag1 Tag2 Tag3 Tag_All 
Jeff Atwood test tag  other test, tag, other 
Matt breeden myTag total last myTag, total, last 

그것은 지금까지 괜찮지 만, 지금은 싶습니다 이 다른 모든 Tag(s) 열을 제거하십시오. 맞습니다, 나는

dtContact.Columns.RemoveAt(2)

일을 시도하지만 내가 그 열이 계산 열 표현에 사용되는 때문입니다 추측하고 'System.ArgumentException'

을 던져? 왜냐하면 내가 열 0 또는 열 1을 제거하기 때문에 그것은 잘 작동합니다. 그래서, 계산 된 열 표현식에서 사용된다면이 다른 모든 Tag(s) 열을 제거 할 수있는 방법이 있습니까? 어떻게 든이 열을 지속적으로 만들 수 있습니까? Google에서 검색했지만 아무 것도 찾을 수 없습니다. 말했듯 또한

는 어떤 ...라고 개까지, 단지 1 Tag1있을 수 단지 2 또는 3 또는 n이 Tag(s) 열들은 동적이며, 수있을 것이라는 고정되지 Tag88 또는 무엇이든간에. 이 코드 밖으로

답변

2

은이 방법을 시도해보십시오 답변

//Usage 
DataTable dtMod = GetModifiedTable(dt); 

//Function to return modified data table 
public DataTable GetModifiedTable(DataTable dt) 
{ 
    var columnList = dt.Columns.Cast<DataColumn>() 
           .Where(x => x.ColumnName.StartsWith("Tag")) 
           .Select(x => x.ColumnName) 
           .ToArray(); 

    DataTable dtNew = new DataTable(); 
    dtNew.Columns.Add("FName"); 
    dtNew.Columns.Add("LName"); 
    dtNew.Columns.Add("Tag_All"); 

    var results = dt.AsEnumerable().Select(r => 
         dtNew.LoadDataRow( 
         new object[] { 
           r.Field<string>("FName"), 
           r.Field<string>("LName"), 
           GetTagValues(r, columnList) 

           }, false 
         )); 

    dtNew.Rows.Add(results.ToArray()); 

    return dtNew; 
} 

//Function to return csv values of given column list 
public string GetTagValues(DataRow r, string[] columns) 
{ 
    string csv = string.Empty; 
    foreach(string column in columns) 
    { 
     csv += r[column].ToString() + ","; 
    } 
    return csv.Substring(0, csv.Length - 1); 
} 
-1

확인 : 그것은 당신의 요구 사항에 따라 일하고

private void creatable() 
{ 
    dt.Columns.Add("FName"); 
    dt.Columns.Add("LName"); 
    dt.Columns.Add("Tag1"); 
    dt.Columns.Add("Tag2"); 
    dt.Columns.Add("Tag3"); 
    dt.Columns.Add("Tag_All"); 
} 
private void removeColumn() 
{ 
     string temp = null; 
     List<string> colToRemove = new List<string>(); 
     int colcount = dt.Columns.Count; 
     for (int i = 0; i <colcount ;i++) 
     { 
      temp = dt.Columns[i].ColumnName; 
      if (temp == "Tag1" || temp == "Tag2" || temp == "Tag3") 
      { 
       colToRemove.Add(temp); 
      } 
      temp = null; 

     } 
     foreach (string item in colToRemove) 
     { 
      dt.Columns.Remove(item); 
     } 
    } 

.

+0

감사합니다,하지만 난 당신이 모든 질문을 읽어 보지 않았 생각합니다.나는 그것이 단지 2 또는 3 개의 열을 가질 것이라고 고정되어 있지 않다고 말했다. 그것은 동적 일 수있다. – Razort4x

0

이 작업을 수행 할 수 없습니다. 다른 접근법을 취해야합니다.

계산 된 열이 아닌 TAG_ALL 열을 추가하십시오. DataTable의 각 행에 대해 모든 TagX 열을 추가하여 Tag_All 열에 값을 할당하십시오. 각 행에 대해 반복하십시오. 끝나면 이제 TagX 열을 삭제할 수 있습니다.

행 수에 따라 실제로는 상당히 빠릅니다.

그러나 이것이 좋은 생각인지 궁금합니다. DataTable을 일부 그리드에 바인딩하는 경우, TagX 열을 바인드하지 않거나 그리드에 보이지 않게 할 필요가있는 모든 것이 필요합니다.

관련 문제