2010-05-06 67 views
1

我的問題是,我想在一個層次結構,所以顯示的數據:如何在分層結構中顯示非規範化的數據?

  • 民主黨
    • 縣委書記
      • 候選人1
      • 候選人2
    • 裁判官
      • 候選人1
      • 候選人2
      • 候選3

但我檢索這樣的數據集:

Party | Office | Candidate 
-------------------------------------------- 
Democrat | County Clerk | Candidate 1 
Democrat | County Clerk | Candidate 2 
Democrat | Magistrate | Candidate 1 
Democrat | Magistrate | Candidate 2 
Democrat | Magistrate | Candidate 3 

我計劃使用嵌套中繼器,但我需要Part的獨特價值y,然後在該方內部區分不同的辦公室名稱以便執行此操作。

有沒有.NET函數可以輕鬆地做我正在嘗試的?是否有更好的方式顯示中繼器以外的信息?

在此先感謝!

+0

如果您的數據在數據庫中 - 您可能想要探索編寫SQL語句 – IMHO 2010-05-06 18:08:45

+0

已經從存儲過程中檢索數據。我的目標是隻使用一個數據庫調用數據。 – 2010-05-06 18:11:32

回答

2

如果你可以修改存儲過程,我建議在鄰接表的形式設置的結果:

ID Name   ParentID 
1  Democrat  NULL 
2  County Clerk 1 
3  Magistrate 1 
4  Candidate 1 2 
5  Candidate 2 2 
6  Candidate 1 3 
7  Candidate 2 3 
8  Candidate 3 3 

它減少了檢索的數據量,並允許您對父遞歸程序兒童關係。你只需從根開始。這種方法通過直接在StringBuilder中構建字符串文字來避免使用嵌套中繼器的麻煩。

StringBuilder sb = new StringBuilder(); 
DataTable dt = new DataTable(); 
someDataAdapter.Fill(dt); 

// find the roots: 
DataRow[] roots = dt.Select("parentId is null"); 

sb.Append("<ul>"); 
foreach (DataRow child in roots) 
{ 
    WriteNode(child, sb); 
} 
sb.Append("</ul>"); 


// recursively write out each node 
public static void WriteNode(DataRow row, StringBuilder sb) { 
    sb.Append("<li>"); 
    sb.Append(row["Name"]); 

    // find children rows... 
    DataRow[] children = row.Table.Select("parentId = " + row["id"].ToString()); 
     if (children.Length > 0) 
     { 
      sb.Append("<ul>"); 
      foreach (DataRow child in children) 
      { 
       WriteNode(child, sb); 
      } 
      sb.Append("</ul>"); 
     } 

     sb.Append("</li>"); 
    } 
+0

非常好!非常感謝。 – 2010-05-31 04:39:32

+0

還有別的東西,如果你不介意回答它: 我需要在每個候選節點中顯示聚合數據(投票的百分比)。在遍歷列表之前,我不會知道這個值。問題在於使用這種方法顯示聚合數據的時間太晚了。 我看到它的方式,我有兩個選擇: - 不顯示,直到某特定職位的所有數據已經​​被完全檢索 - 動態添加在標籤/文字要做到這一點,在以後的日子 由於一噸。 – 2010-05-31 19:38:15

+1

理想情況下,您可以在存儲過程中計算這些百分比。否則,可以使用LINQ最容易地預先計算百分比,然後在寫入節點時從列表中進行選擇。 – 2010-06-01 03:32:58

1

我不確定你是否有興趣使用第三方控件,但是我有你的完全相同的需求並需要顯示數據分層次顯示重複值與單個可摺疊節點(如樹)。但是,Tree控件不受數據約束,仍然需要一定的編碼。但是這種基於非標準化數據的樹型構建可以使用DataBinding輕鬆完成。我使用的FlexGrid是DataBound DataTable,只需要幾行代碼即可基於第三方控件正確顯示您需要的內容。

我已經使用了ComponentOne FlexGrid控件,並使用其'SubTotal'功能來生成分層數據。我粘貼下面的代碼,以防萬一您有興趣使用ComponentOne FlexGrid。您可以下載演示副本並進行檢查。

 // Showing master policy in GROUPS 
     // ----------------------------------------------------------------------------------- 
     // set tree mode to show settings in GROUPS 
     flxAvailableSettings.Tree.Style = TreeStyleFlags.Simple; 
     // show outline tree on column 1. 
     flxAvailableSettings.Tree.Column = 0; 
     flxAvailableSettings.Cols[0].Visible = true; 
     flxAvailableSettings.Cols[0].Width = 15; 
     flxAvailableSettings.AllowMerging = AllowMergingEnum.Nodes; 
     // subtotal on column 1, outline level 0 
     flxAvailableSettings.Subtotal(AggregateEnum.None, 0, 0, 0, "{0}"); 
     // use owner draw to suppress repeating group names in Non-Node rows 
     flxAvailableSettings.DrawMode = DrawModeEnum.OwnerDraw; 
     flxAvailableSettings.OwnerDrawCell += new C1.Win.C1FlexGrid.OwnerDrawCellEventHandler(flxAvailableSettings_OwnerDrawCell); 
     // done, autosize columns to finish 
     flxAvailableSettings.AutoSizeCols(); 
     // ----------------------------------------------------------------------------------- 

    private void flxAvailableSettings_OwnerDrawCell(object sender, C1.Win.C1FlexGrid.OwnerDrawCellEventArgs e) 
    { 
     if (!flxAvailableSettings.Rows[e.Row].IsNode && flxAvailableSettings.Cols[e.Col].Name == "PolicyGroup") 
      e.Text = ""; 
    } 

的flxAvailableSettings.Subtotal(AggregateEnum.None,0,0,0, 「{0}」)線生成樹組,雖然我需要組對單個列,則可以使用基團上的多個列。只需在Subtotalling上提及他們的文檔示例。

希望這會有所幫助。