2008-10-06 66 views
10

我需要從我的數據訪問層檢索一組Widgets,按widget.Manufacturer分組,以顯示在一組嵌套ASP.NET ListViews中。使用嵌套ListViews顯示IGrouping <>

問題是,(據我所知)嵌套的ListView方法需要我在使用它之前對數據進行整形,而我無法找出最佳方法。我已經能夠拿出迄今最好是把一個LINQ查詢我的數據訪問層,像這樣:

var result = from widget in GetAllWidgets(int widgetTypeID) 
      group widget by widget.Manufacturer into groupedWidgets 
      let widgets = from widgetGroup in groupedWidgets 
          select widgetGroup 
      select new { Manufacturer = groupedWidgets.Key, Widgets = widgets }; 

當然,匿名類型不能被傳來傳去,所以那並不是」工作。定義一個自定義類來包含數據似乎是錯誤的方法。有什麼辦法可以在ASP.NET的一方執行分組嗎?我使用ObjectDataSources來訪問DAL。

更新:OK,我不會再創建一個匿名類型,而不是我的DAL傳遞一個IEnumerable<IGrouping<Manufacturer, Widget>>到ASP.NET頁面,但我怎麼能在我的列表視圖使用?我需要(幾乎或類似的東西)呈現以下HTML

<ul> 
    <li>Foo Corp. 
    <ol> 
     <li>Baz</li> 
     <li>Quux</li> 
    </ol> 
    </li> 
    <li>Bar Corp. 
    <ol> 
     <li>Thinger</li> 
     <li>Whatsit</li> 
    </ol> 
    </li> 
</ul> 

本來,我有過這樣一個ListView內的ListView:

<asp:ListView ID="ManufacturerListView"> 
    <LayoutTemplate> 
     <ul> 
      <asp:Placeholder ID="itemPlaceholder" runat="server" /> 
     </ul> 
    </LayoutTemplate> 
    <ItemTemplate> 
     <li><asp:Label Text='<%# Eval("Manufacturer.Name") %>' /> 
     <li> 
     <asp:ListView ID="WidgetsListView" runat="server" DataSource='<%# Eval("Widgets") %>'> 
      <LayoutTemplate> 
       <ol> 
        <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> 
      </ol> 
      </LayoutTemplate> 
      <ItemTemplate> 
       <li><asp:Label Text='<%# Eval("Name") %>'></li> 
      </ItemTemplate> 
     </asp:ListView> 
     </li> 
    </ItemTemplate> 
</asp:ListView> 

注WidgetsListView的DataSource財產是怎麼本身數據綁定。如何在不重新調整數據的情況下複製此功能?

這是越來越複雜,對不起,如果我應該只是提出一個單獨的問題,而不是。

回答

12

好吧,我要與我之前的聲明相抵觸。由於eval想要嵌套控件中的某種屬性名稱,我們應該可以形成這些數據。

public class CustomGroup<TKey, TValue> 
{ 
    public TKey Key {get;set;} 
    public IEnumerable<TValue> Values {get;set;} 
} 

//正是如此使用它...

IEnumerable<CustomGroup<Manufacturer, Widget>> result = 
    GetAllWidgets(widgetTypeId) 
    .GroupBy(w => w.Manufacturer) 
    .Select(g => new CustomGroup<Manufacturer, Widget>(){Key = g.Key, Values = g}; 

///以至後來......

<asp:ListView ID="ManufacturerListView"> 
<LayoutTemplate> 
    <ul> 
     <asp:Placeholder ID="itemPlaceholder" runat="server" /> 
    </ul> 
</LayoutTemplate> 
<ItemTemplate> 
    <li><asp:Label Text='<%# Eval("Key.Name") %>' /> 
    <li> 
    <asp:ListView ID="WidgetsListView" runat="server" DataSource='<%# Eval("Values") %>'> 
     <LayoutTemplate> 
      <ol> 
       <asp:PlaceHolder runat="server" ID="itemPlaceholder" /> 
      </ol> 
     </LayoutTemplate> 
     <ItemTemplate> 
      <li><asp:Label Text='<%# Eval("Name") %>'></li> 
     </ItemTemplate> 
    </asp:ListView> 
    </li> 
</ItemTemplate> 
</asp:ListView> 
3

當你使用LINQ to組,你可以得到一個強類型的對象,而該整形:

List<int> myInts = new List<int>() { 1, 2, 3, 4, 5 }; 
IEnumerable<IGrouping<int, int>> myGroups = myInts.GroupBy(i => i % 2); 
foreach (IGrouping<int, int> g in myGroups) 
{ 
    Console.WriteLine(g.Key); 
    foreach (int i in g) 
    { 
    Console.WriteLine(" {0}", i); 
    } 
} 
Console.ReadLine(); 

在你的情況,你必須:

IEnumerable<IGrouping<Manufacturer, Widget>> result = 
    GetAllWidgets(widgetTypeId).GroupBy(w => w.Manufacturer); 

這將讓你從方法返回結果。

+0

感謝您的意見。我用更多的信息更新了我的原始問題。 – 2008-10-06 23:17:41

5

我剛剛花了相當長一段時間這一點。最終找到了解決方案,它非常簡單。


var enumerableData = myData.Tables[0].AsEnumerable(); 
var groupedData = enumerableData.GroupBy(x => x["GroupingColumn"]); 

myParentRepeater.DataSource = groupedData; 
myParentRepeater.DataBind(); 

<asp:Repeater ID="myParentRepeater" runat="server"> 
    <ItemTemplate> 
    <h3><%#Eval("Key") %></h3> 
    <asp:Repeater ID="myChildRepeater" runat="server" DataSource='<%# Container.DataItem %>'> 
     <ItemTemplate> 
     <%#((DataRow)Container.DataItem)["ChildDataColumn1"] %> 
     <%#((DataRow)Container.DataItem)["ChildDataColumn2"] %> 
     </ItemTemplate> 
     <SeparatorTemplate> 
     <br /> 
     </SeparatorTemplate> 
    </asp:Repeater> 
    </ItemTemplate> 
</asp:Repeater> 

的eval( 「鑰匙」)返回分組值。 當檢索子信息時,Container.DataItem是IGrouping類型,但您只需將其轉換爲正確的類型。

希望這可以幫助別人。

+0

在您的項目模板中,您可以用`<%#Eval(「ChildDataColumn1」)%>`替換`<%#((DataRow)Container.DataItem)[「ChildDataColumn1」]%>`。 – Armstrongest 2010-05-10 17:50:49

相關問題