2012-10-11 4 views
1

Datatable에서 테이블을 수정하고 싶습니다. linq을 사용하고 결과를 그룹화해야한다는 것을 알고 있습니다. 전 :행이있는 데이터 테이블 수정 가능

ID  Name LastName 
1  Kiki ha 
3  lola mi 
2  ka  xe 
2  Kiki ha 

후 :

Name LastName 1 3 2 
Kiki ha  x  x 
lola mi   x 
ka  xe    x 

내 원래 코드 : 나는이를 시도했지만 작동하지 않았다

DataTable table1 = new DataTable("table"); 
    table1.Columns.Add("ID", typeof(String)); 
    table1.Columns.Add("Name", typeof(String)); 
    table1.Columns.Add("Lastname", typeof(String)); 

    object[] a1 = { 1, "Kiki", "ha" }; 
    object[] a2 = { 3, "lola", "mi" }; 
    object[] a4 = { 2, "ka", "xe" }; 
    object[] a5 = { 2, "kiki", "ha" }; 
    table1.Rows.Add(a1); 
    table1.Rows.Add(a2); 
    table1.Rows.Add(a4);   
    table1.Rows.Add(a5); 

:

var result = from t1 in table1.AsEnumerable() 
       group t1 by new {ID = t1.Field<String>("ID")} into grp 
        select new 
        { 
         ID = grp.Key.ID, 
         //something must be there 
        }; 
    DataGridView1.DataSource = result.ToList(); 
+0

당신이 정말로 그 테이블의 모든 ID에 대한 열을 추가 하시겠습니까? –

+0

예, 모든 ID에 대해 열을 추가하므로 열 1, 열 3 및 열 2가됩니다 –

+0

... 'x'는'x' 또는 bool입니까? –

답변

2

이해야 필요한 것을하십시오 :

var nameGroups = from row in table1.AsEnumerable() 
       group row by new 
       { 
        Name = row.Field<string>("Name").ToLower(), 
        LastName = row.Field<string>("Lastname").ToLower(), 
       } into NameGroups 
       select NameGroups; 

var tblOut = new DataTable(); 
tblOut.Columns.Add("Name"); 
tblOut.Columns.Add("LastName"); 
var distinctIDs = table1.AsEnumerable() 
         .Select(r => r.Field<string>("ID")) 
         .Distinct(); 

foreach (var id in distinctIDs) 
    tblOut.Columns.Add(id); 

foreach (var grp in nameGroups) 
{ 
    var row = tblOut.Rows.Add(); 
    row.SetField<string>("Name", grp.Key.Name); 
    row.SetField<string>("LastName", grp.Key.LastName); 
    foreach (DataColumn idCol in tblOut.Columns.Cast<DataColumn>().Skip(2)) 
    { 
     bool userHasID = grp.Any(r => r.Field<string>("ID") == idCol.ColumnName); 
     row.SetField<string>(idCol, userHasID ? "x" : ""); 
    } 
} 

대소 문자를 구분하여 그룹화해야하므로 소문자 이름을 출력합니다.

편집 다음은 디버거 창에서 DataTable의 스크린 샷입니다 :

enter image description here

+0

코드를 시도했지만 테이블은 볼 수 있지만 열 2 및 부울 매개 변수가없는 경우 dataGridView1.DataSource = tblOut; 어떻게해야합니까? –

+1

@UniLe : DataTable이 사용자가 요구 한 것임을 보여주는 답을 편집했습니다. –

+1

네, 그게 정확하고 나를 위해 작동합니다. 어쩌면 그리드 크기가 충분하지 않거나 스크롤해야 할 수도 있습니다. 그러나 그것은 또 다른 질문입니다. 디버거에서 결과가 올바른지 확인할 수 있습니다. 중단 점을 추가하고 빠른 시계 창에서'tblOut'을 검사하면됩니다. 그 다음에 독서 유리 아이콘을 클릭하십시오. –