2012-09-16 2 views
0

XML 파일에서 데이터를 가져온 다음 datatable.Select()를 사용하여 필터링하여 콤보 상자에 값을 추가하려고합니다.datatable.select를 사용하여 고유 값을 가져 오려고 시도합니다.

그러나 중복 값을 얻고 있으므로 DISTINCT 정렬을 적용해야합니다. dt1.DefaultView.ToTable을 시도했지만 행운은 없습니다. 여전히 그것의 콤보 상자에 중복 된 항목을 추가합니다.

DataTable dt1 = XMLCategory.ds.Tables["AgencyInfo"]; 

DataRow[] foundRows; 
foundRows = dt1.Select("AgencyRegion='" + cmbAgPr_Region.Text + "'"); 
DataTable dt2 = dt1.DefaultView.ToTable(true, "AgencyMarket"); 
for (int i = 0; i < foundRows.Length; i++) 
{ 
    cmbAgPr_Market.Items.Add(foundRows[i][1]); 
} 

어떤 도움 ..

+0

왜 XML을 직접 읽고 콤보로보다는 DataTable을 통해 결합하지 않는 : 샘플 코드는 아래가 string 유형 열 "COLUMNNAME"의 구별 할 필요가 가정? –

+0

왜냐하면 나는 첫 번째 열 값에 따라 데이터를 필터링해야하고 두 번째 열 데이터는 필터 후 콤보 상자에 채워야하기 때문입니다. 더 나은 대안이 있는지 알려 주시기 바랍니다. – Imran

+0

당신은 어느 분야에서 중복 되었습니까? –

답변

1

을 당신은 별개 얻을 GroupBy에 LINQ를 사용할 수 있습니다.

var foundRows = dataTable.Select("...") 
        .GroupBy(row => row.Field<string>("columnName"), 
          (key, group) => group.First()) 
        .ToArray(); 
+0

완벽하게 작업하면 내 문제가 좀 더 해결 될 것입니다. Cuong과 LINQ에게 감사드립니다. – Imran

0

편집 : 아래 내가 사용하고있는 코드는 마이너 노는가 수정되었습니다.

dt1이 아닌 dt2의 행으로 목록 상자를 채워야합니다. ToTable은 dt2로 돌아가지만 foundRows는 dt1에서옵니다. 그러면 다음과 같이 문제가 해결됩니다.

DataRow[] distinctRows = dt2.Select(); 
for (int i=0; i < distinctRows.Length; i++) 
{ 
    cmbAgPr_Market.Items.Add(distinctRows[i][1]); 
} 

그냥 완전성을 위해, 당신은 다른 구조로 distinctRows의 행을 통해 FOREACH 수 :

foreach(Row currentRow in distinctRows) 
{ 
    cmbAgPr_Market.Items.Add(currentRow[1]); 
} 
+0

위의 코드는 dt2.rows에 대해 DataRowCollection이므로 오류가 발생합니다. "암시 적으로 'System.Data.DataRowCollection'형식을 'System.Data.DataRow []'형식으로 변환 할 수 없습니다. datatable에 datatable 값을 할당하는 방법이 없습니다. – Imran

+0

1 초, 수정 될 것입니다 ... –

+0

좋아, 내 어리 석음은 ... dt2에서 선택을 호출해야합니다. Rows 속성을 참조하지 마십시오. 미안합니다!! –

관련 문제