2008-10-06 14 views
10

मैं नेस्ट ASP.NET listviews का एक सेट में प्रदर्शित करने के लिए अपने डेटा का उपयोग परत, widget.Manufacturer के आधार पर वर्गीकृत, से विजेट का एक सेट को पुनः प्राप्त करने की जरूरत के साथ एक IGrouping <> दिखाना।नेस्टेड listviews

समस्या यह है कि (जहां तक ​​मैं कह सकता हूं) नेस्टेड लिस्ट व्यू दृष्टिकोण के लिए मुझे इसका उपयोग करने से पहले डेटा को आकार देने की आवश्यकता होती है, और मैं लेने के लिए सबसे अच्छा तरीका नहीं समझ सकता। सबसे अच्छा मैं अब तक के साथ आने कर लिया है तो तरह मेरे डेटा का उपयोग परत में एक 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 तरफ समूहीकरण प्रदर्शन कर सकते हैं है? मैं DAL तक पहुंचने के लिए ऑब्जेक्टडेटा स्रोत का उपयोग कर रहा हूं।

अपडेट किया गया: ठीक है, मैं एक गुमनाम प्रकार अब और बनाने नहीं कर रहा हूँ, और बदले मेरी दाल ASP.NET पेज के लिए एक IEnumerable<IGrouping<Manufacturer, Widget>> गुजरता है, लेकिन मुझे लगता है कि मेरे listviews में इस का उपयोग कर सकते हैं?

<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 संपत्ति ही है: मैं (काफी इसे पसंद या कुछ और) निम्नलिखित एचटीएमएल प्रस्तुत करना

<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 था आंकड़ों की सीमा। डेटा को दोबारा बदलने के बिना मैं इस कार्यक्षमता को कैसे डुप्लिकेट कर सकता हूं?

इस तरह के जटिल, खेद हो रहा है, तो मैं सिर्फ बजाय एक अलग सवाल बना होना चाहिए।

उत्तर

12

ठीक है, मैं अपने पूर्व के बयान का खंडन करने के लिए जा रहा हूँ। के बाद से eval नेस्टेड नियंत्रण में प्रॉपर्टी का नाम किसी तरह चाहता है, हम शायद उस डेटा को आकार चाहिए।

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

// और यह thusly का उपयोग करें ...

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 का उपयोग कर रहे हैं, तो आप एक जोरदार टाइप किया उद्देश्य यह है कि आकार देने के बिना प्राप्त कर सकते हैं: आपके मामले में

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

सलाह के लिए धन्यवाद। मैंने अधिक जानकारी के साथ अपना मूल प्रश्न अपडेट किया। –

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

अपने आइटम टेम्पलेट में, आप '<% # ((डेटारो) कंटेनर। डेटाटाइम) ["चाइल्डडाटा कॉलम 1"]%> '' <% # Eval ("ChildDataColumn1")%> 'के साथ बदल सकते हैं। – Armstrongest

+0

ग्रेट मिल! मैं कुछ प्रकार के मूल्य की तलाश में था जैसे "। वैल्यूज" या कुछ। एक खोज क्वेरी में भी डालना मुश्किल है। धन्यवाद! – rtpHarry

संबंधित मुद्दे