2010-04-13 4 views
2

현재 원격 지원 시스템의 사용자에 대한 보고서를 가져 오기 위해 webservice를 사용하고 있습니다.DataGridView에 XML 문자열

내 보고서를 당기는 결과를받은 후, 나는 다시 방법으로 다음과 같은 문자열을 제공하고있다 :

<report> 
    <header> 
     <field id="0">Source</field> 
     <field id="1">Session ID</field> 
     <field id="2">Date</field> 
     <field id="3">Name</field> 
     <field id="24">Technician Name</field> 
     <field id="25">Technician ID</field> 
    </header> 
    <data> 
     <row> 
      <field id="0">Email</field> 
      <field id="1">55037806</field> 
      <field id="2">4/13/2010 2:28:06 AM</field> 
      <field id="3">Bill Gates</field> 
      <field id="24">John</field> 
      <field id="25">1821852</field> 
     </row> 
     <row> 
      <field id="0">Telephone</field> 
      <field id="1">55034548</field> 
      <field id="2">4/13/2010 12:59:44 AM</field> 
      <field id="3">Steve Jobs</field> 
      <field id="24">John</field> 
      <field id="25">1821852</field> 
     </row> 
    </data> 
</report> 

이 문자열을받은 후, 내가있는 DataGridView에 실제 데이터를 받아와 표시해야합니다. 나는 그것을 XMLDocument에 집어 넣으려고 시도했으나 실패했다. 다른 눈에 관심이 있습니다 :) 응용 프로그램은 VS2010의 C#으로 작성되었습니다.

답변

2

당신은 XML 파일에서 열 이름을 가진 DataTable를 구축하는 LINQ to XML을 사용할 수, 다음 DataGridViewDataSource로 해당 테이블을 설정

 string xml = theWebService.TheMethod(); 
     XDocument doc = XDocument.Parse(xml); 
     var queryHeaders = 
      from field in doc.Root.Element("header").Elements("field") 
      select new 
      { 
       Id = field.Attribute("id").Value, 
       Name = field.Value 
      }; 

     var headers = queryHeaders.ToDictionary(f => f.Id, f => f.Name); 

     DataTable table = new DataTable(); 
     foreach (var kvp in headers) 
     { 
      table.Columns.Add(kvp.Value); 
     } 

     Func<XElement, DataRow> rowGenerator = 
      element => 
      { 
       var row = table.NewRow(); 
       foreach (var field in element.Elements("field")) 
       { 
        string fieldId = field.Attribute("id").Value; 
        string columnName = headers[fieldId]; 
        string value = field.Value; 
        row[columnName] = value; 
       } 
       return row; 
      }; 

     var rows = 
      from rowElement in doc.Root.Element("data").Elements("row") 
      select rowGenerator(rowElement); 

     foreach (var row in rows) 
     { 
      table.Rows.Add(row); 
     } 

     dataGridView.AutoGenerateColumns = true; 
     dataGridView.DataSource = table; 

참고 만 위의 코드가 모든 경우에 작동 필드에는 고유 한 이름이 있습니다. 그런 경우가 아니라면 필드 ID를 DataColumn 이름으로 사용하고 DGV의 헤더를 실제 필드 이름으로 변경하고 싶을 수도 있습니다.

+0

매력처럼 작동 했으므로 안내에 감사드립니다! –

+0

실제로 긴 보고서를 가져 오면 XML에 여러 "헤더"항목이 생성됩니다. 그 누구에 대한 생각? 토머스의 제안은 머리글 하나만 돌려 보내면 훌륭하게 작동합니다. –

+0

문자열은 XML의 각 추가 사례에서 동일하므로 문자열의 중복 헤더 항목을 구문 분석 할 수 있습니다. –