2014-10-30 7 views
1

웹 서비스가 있고 아래 코드에서 항목 모음을 반복합니다. 이러한 항목은 XML 형식으로 멋지게 표시됩니다 (아래 예제 참조). 그러나 나는 그것들을 패션과 같이 테이블에 표시하고 싶습니다. 나는 거기에 항목을 삽입하고 그들을 다시 표시하는 datatable을 사용하여 생각.세로 행을 가로 데이터 테이블로 변환

585344 
     585344 Title Issue 1 
     585344 Number 140024 
     585344 State In progress 
585350 
     585350 Title Issue 2 
     585350 Number 140026 
     585350 State Classification 

어떻게 이런 식으로 표시 할 수 있습니다 :

ID  | Title    | Number | State   
585344  issue 1    140024  In progress 

static void Main(string[] args) 
    { 
     ABWebService webSvc = new ABWebService(); 
     GetObjectListData gold = new GetObjectListData(); 

     gold.folderPath = "01. ITSM - Service Operation"; 
     gold.RequiredField = new RequiredField[3]; 
     gold.RequiredField[0] = new RequiredField {Value = "Title"}; 
     gold.RequiredField[1] = new RequiredField {Value = "Number"}; 
     gold.RequiredField[2] = new RequiredField {Value = "State"}; 

     try 
     { 
      GetObjectListResult golr = webSvc.GetObjectList(gold); 

      List<NewsTracker> list = new List<NewsTracker>(); 
      if (golr.success) 
      { 
       ObjectData[] myObjects = golr.Object; 
       for (int i = 0; i < myObjects.Length; i++) 
       { 
        Console.WriteLine(myObjects[i].id); 
        foreach (object myItem in myObjects[i].Items) 
        { 
         string field1 = string.Empty; 
         string val1 = string.Empty; 
         int val2 = 0; 
         string field2 = string.Empty; 

         StringVal item = myItem as StringVal; 
         if (item != null) 
         { 
          field1 = item.name; 
          val1 = item.Value; 
          Console.WriteLine("\t" + myObjects[i].id + " " + field1 + " " + val1); 

         } 

         LongIntVal val = myItem as LongIntVal; 
         if (val != null) 
         { 
          field2 = val.name; 
          val2 = val.Value; 
          Console.WriteLine("\t" + myObjects[i].id + " " + field2 + " " + val2); 

         } 

        } 
       } 
      } 

     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex.Message); 
      throw; 
     } 
    } 

편집 1 :

당신이 말해 줄 수 나는 일반적인 목록에 추가 할 수있는 방법 이런 식으로 : list.Add(new NewsTracker(title,number,state)); 그래서 내가 반복 할 수 있고 목록으로 다른 일을 할 수 있습니까?

+0

'DataSet.ReadXml (filePath, XmlReadMode)'는 당신과 같은 단일 레벨 XML을 읽을 수있게 해줍니다. – Franck

+0

트리 형태의 디스플레이가 귀하의 질문과 관련이없는 것 같습니다. 당신은 테이블을 표시하려고 무엇을 했습니까? –

답변

1

키 (예 : ID)로 그룹화하고 그에 따라 다른 값을 채울 수 있습니다.

의사 코드 : 이

// Consider ID as the key (maybe int in your case) and GenericProperty as a class of just 2 properties: name of property and value. 
List<YourClass> list; 
Dictionary<ID, HashSet<GenericProperty>> dict = ConvertToDictionary(list); // Convert the list to a dictionary 
// Aggregate values per ID (key) 
// You can get the PropertyName with reflection 

foreach (var pair in dict) 
{ 
    var row = DataTable.Rows.AddRow(); 

    foreach (var values in pair.Value) 
     row[pair.Value.PropertyName] = pair.Value.Value; 
} 

주 당신이 돈 경우 그 '당신은 일반적인 코드를 원하는 경우에, 당신은 다음과 같이 "열 이름"과 "값"상관 관계, 몇 가지 일반적인 속성을 사용할 수 있습니다 GenericProperty 클래스는 모든 값을 속성으로 갖는 특정 클래스 일 수있는 일반적인 코드가 필요하지 않습니다. 귀하의 예제에서 3 가지 속성 : 제목, 숫자, 상태. 그런 다음이를 사용하여 DataTable을 채울 수 있습니다. 예를 들면 다음과 같습니다.

덧붙여 Franck는 반사 형 (예 : here)으로 속성 이름과 값을 얻을 수 있다고 말했습니다. (질문 편집 기준)

편집 :

이의 당신이 보여준 "myObjects"개체에 대한 예제를 만들어 보자.

정확하게 이해하면 "myObjects"는 이미 그룹화 된 목록입니다. 따라서 "myObjects.Items"는 그룹화 된 하나의 키 값입니다.

그래서 우리는이 :

List<NewsTracker> list = new List<NewsTracker>(myObjects.Count); 
foreach (var obj in myObjects) 
{ 
    // 'obj' is one key, so one value of NewsTracker 
    NewsTracker nt = new NewsTracker(); 

    foreach (var item in myObjects.Items) 
    { 
     // Capture the name of the item and check what property is it from 
     // Code you've show in your question. --> I'll consider that you already know how to get "fieldName" as with "value" (object) 
     if (fieldName.Equals("Title")) 
      nt.Title = (string)value; 
     else if (fieldName.Equals("Number") 
      nt.Number = (int)value; 
     // ... and so on ... 
    } 
    // At the end of the inner loop, we must have a "NewsTracker" filled with the correct values, so now we only need to add them to the main list 
    list.Add(nt); 
} 

참고 : 나는 'NewsTracker'클래스를 considerind 문제에 특정 코드를 작성했습니다.

+0

감사합니다. Luri와 Franck. 귀하의 도움은 대단히 감사하겠습니다. –

+0

@BurreIfort, 오신 것을 환영합니다! :) 그러나 그것의 Iúri (i) LOL. –

+0

@BurreIfort 왜 정답을 가져 왔습니까? 다른 사람들은 질문의 해결책에 관심을 가질 수 있습니다. 질문에 답을 남기지 마십시오. 감사. –

1

간단한 유형 만있는 경우 리플렉션을 사용하여 해당 테이블을 작성할 수 있습니다. 여기에 웹 서비스에 클래스 정보를 보내기 위해 자주 사용하는 메소드 예제가있다. 당신이 논리

public static DataTable ObjectToData(object o) 
{ 
    DataTable dt = new DataTable("OutputData"); 
    DataRow dr = dt.NewRow(); 
    dt.Rows.Add(dr); 

    o.GetType().GetProperties().ToList().ForEach(f => 
    { 
     try 
     { 
      f.GetValue(o, null); 
      dt.Columns.Add(f.Name, f.PropertyType); 
      dt.Rows[0][f.Name] = f.GetValue(o, null); 
     } 
     catch { } 
    }); 

    return dt; 
} 

을 이해하면 당신은

아래 구조에 따라 객체를 ClassA를 전달하는 경우 목록을 받아 여러 행이 한 테이블을 만드는 불통 수 있습니다
ClassA 
{ 
    string Value1 = "abc"; 
    DateTime Value2 = DateTime.Now(); 
    int Value3 = 12;  
} 

ObjectToData(MyClassA); 다음과 같이됩니다 데이터 테이블 :

|----------|-------------------------|----------| 
| Value1 |   Value2   | Value3 | 
|==========|=========================|==========| 
| "abc" | 2015/10/30 08:00:00 AM | 12 | 
|----------|-------------------------|----------| 
+0

답장을 보내 주셔서 감사합니다. 그러나 다음과 같은 일반적인 목록에 어떻게 추가 할 수 있는지 말씀해 주시겠습니까? 'list.Add (새 NewsTracker (제목, 숫자, 상태));' 목록은? –

+0

당신은 데이터 테이블로부터'List '을 생성하는 것을 의미합니까? – Franck

+0

항목이 객체 유형 인 경우 Linq에 대한 형식은 myObjects [i] .Items –