2010-01-19 11 views
6

मेरे पास एक ऑब्जेक्टडेटासोर्स है जिसे मैं दोहराना चाहता हूं। समस्या यह है कि, मैं पंक्तियों की परिवर्तनीय मात्रा वाले स्तंभों की परिवर्तनीय मात्रा को प्रदर्शित करने के तरीके को कैसे काम नहीं कर सकता।परिवर्तनीय पुनरावर्तक कॉलम

उदाहरण के लिए

:

डाटासेट मैं इस तरह संरचित है। ऑब्जेक्टडेटासोर्स List<item> है।

item { 
    string name; 
    List<itemdata> data; 
} 

itemdata { 
    DateTime year; 
    double amount; 
} 

तो बुनियादी तौर पर मैं एक मेज

 | year | year | year | year 
name | amount | amount | amount | amount 
name | amount | amount | amount | amount 
name | amount | amount | amount | amount 
name | amount | amount | amount | amount 

मदों की संख्या चर रहे हैं, साथ ही ItemData की संख्या है कि आइटम शामिल करना चाहते हैं।

आशा है कि कोई मुझे सही दिशा में इंगित कर सकता है।

धन्यवाद

+0

क्या मैं <हेडर टेम्पलेट> टैग में एक नेस्टेड रिपेटर डाल सकता हूं? – Mike

उत्तर

6

करने के लिए अपने name_data सूची बाध्य करने के लिए सक्षम होना चाहिए। इस तरह मार्कअप के साथ शुरू करें।

<table> 
     <tr class="headerRow"> 
      <td> &nbsp;</td> 
      <asp:Repeater ID="rptYearHeader" runat="server" OnItemDataBound="rptYearHeader_ItemDataBound"> 
       <ItemTemplate> 
       <td class="header"><asp:Literal ID="litYear" runat="server"></asp:Literal></td> 
       </ItemTemplate> 
      </asp:Repeater> 
     </tr> 
     <asp:Repeater ID="rptName" runat="server" ItemDataBound="rptName_ItemDataBound"> 
      <ItemTemplate> 
      <tr> 
       <td><asp:Literal ID="litName" runat="server"></asp:Literal></td> 
       <asp:Repeater ID="rptAmounts" runat="server" OnItemDataBound="rptAmounts_ItemDataBound"> 
       <ItemTemplate> 
       <td><asp:Literal ID="litAmount" runat="server"></asp:Literal></td> 
       </ItemTemplate> 
      </asp:Repeater> 
      </tr> 
      </ItemTemplate> 
     </asp:Repeater> 
    </table> 

इससे बाध्यकारी थोड़ा मुश्किल हो सकता है। विचार है, सबसे पहले हम हेडर पंक्ति को बांधते हैं - फिर हम डेटा पंक्तियों और स्तंभों में बाध्य करते हैं। आप OnItemDataBound ईवेंट का उपयोग करके कोड के माध्यम से कोड के माध्यम से बाध्यकारी डेटा को संभालना चाहते हैं ताकि आप आवश्यक डेटा के साथ नेस्टेड रिपेटर को तार कर सकें।

सबसे पहले हम हेडर पंक्ति को वर्षों के साथ बांधते हैं। आपको अपने डेटासोर्स में मौजूद अद्वितीय वर्षों का संग्रह अलग करना होगा और इसे एक निजी चर में रखना होगा। बाद में अन्य पुनरावर्तकों के डेटा बाध्यकारी के दौरान आपको इसे एक्सेस करने की आवश्यकता होगी। यह प्रत्येक वर्ष के लिए एक सेल/कॉलम बनाने, शीर्षलेख पंक्ति के डेटा स्रोत के रूप में कार्य करेगा।

List<DateTime> _Years = dataSource.SelectMany(x => x.data).GroupBy(y => y.Year); 
rptYear.DataSource = _Years; 
rptYear.DataBind(); 

अब, आपको अपने मूल डेटा स्रोत के साथ नाम पुनरावर्तक को बांधना होगा। कुछ

rptName.DataSource = dataSource; 
rptName.DataBind(); 

यह आपकी सूची में प्रत्येक आइटम के लिए एक पंक्ति बनाएगा।

इस दोहराने के लिए OnItemDataBound घटना के दौरान, आपको वित्तीय वर्ष की सूची में नेस्टेड रिपेटर को बाध्य करने की आवश्यकता होगी - प्रत्येक वर्ष वित्तीय वर्ष में प्रत्येक हमारे वर्ष में - वर्तमान पंक्ति के डेटा आइटम से किसी भी लागू डेटा के साथ। यह थोड़ा मुश्किल हो जाता है, लेकिन मैं समझाने की कोशिश करूंगा:

protected void rptName_ItemDataBound(object sender, RepeaterItemEventArgs e) 
{ 
// get the data item being bound 
item currentItem = e.Item.DataItem as item; 

// bind the item's name to the literal 
//... 
// 

// get a list of amounts to bind to the nested repeater 
// because we cant be sure that every item has amount for all years 
// we create a list that we know has all years and plug in the items 
// data accordingly. 

    List<double> amounts = new List<double>(); 
    for (int i = 0; i < _Years.Count; i++) 
    { 
     // check whether the current item has data for the year 
     dataItem di = currentItem.data.Where(d => d.Year == _Years[i]).FirstOrDefault(); 

     if(di == null) 
     { 
      // the year did not exist, so we add an amount of 0 
      amounts.Add(0); 
     } 
     else 
     { 
      // the year did exist, so we add that year's amount 
      amounts.Add(di.amount); 
     } 
    } 

    // we now have a list of amounts for all possible years, with 0 filling in 
    // where the item did not have a value for that year 

    // bind this to the nested repeater 
    rptAmounts.DataSource = amounts; 
    rptAmounts.DataBind(); 

} 

शुभकामनाएं।

मुझे इसे उप-कुल और ग्रैंड कुल पंक्तियों के लिए कई नेस्टेड रिपियटर्स के साथ खींचना पड़ा है। मैंने अपनी नींद में नेस्टेड रिपियटर्स को देखना शुरू कर दिया।

+1

यह शानदार प्रतिक्रिया है। इसने काम कर दिया। आपका बहुत बहुत धन्यवाद। मुझे लगता है कि मैं अपनी नींद में नेस्टेड रिपियटर्स को भी देखना शुरू कर रहा हूं। : पी – Mike

0

मैं तुम्हें इस तरह एक नया डेटा संरचना में अपने डेटा को परिवर्तित करने का सुझाव:।

name_data { 
    string name; 
    int[] amounts; 
} 

फिर आप एक लिस्ट में अपने पुनरावर्तक बाध्य होगा (name_data>

इस बनाने के लिए , सबसे पहले, item और data सूचियों के माध्यम से पुनरावृत्त करें और रिपोर्ट करने के लिए आवश्यक सभी अद्वितीय वर्षों की एक सूची (संभवतः एक सूची) रखें। परिणामी सूची को क्रमबद्ध करें ताकि वर्षों क्रमबद्ध हो। अब, वर्ष सूची की अनुक्रमणिका अपनी आउटपुट टेबल में कॉलम नंबर पर ऑनड करें। इसके बाद, item सूची के माध्यम से दोबारा शुरू करें, इस बार प्रत्येक item ऑब्जेक्ट के लिए एक नया name_data ऑब्जेक्ट बनाना। Name_data कन्स्ट्रक्टर इस तरह दिखेगा:

public name_data(string name, int yearCount) { 
    this.name = name; 
    amounts = new int[yearCount]; 
} 

वर्ष गणना वर्ष सूची में आइटमों की संख्या है।

अंत में, वर्तमान item के लिए data सूची के माध्यम से कदम, ऊपर वर्ष वर्ष सूची में सूचकांक प्राप्त करने के लिए, तो इसी amounts स्लॉट में राशि खाने की राशि मूल्य छड़ी लग रहे हो। सूची में अपना पूरा नाम_डेटा जोड़ें।

आपकी समस्या को तीन अलग-अलग रिपीटर्स, जिनमें से एक दूसरे के अंदर नीडिंत है की आवश्यकता होगी का हल हो जाने के बाद, आप अपने पुनरावर्तक

+0

मुझे यकीन नहीं है कि संरचना उसके लिए काम करेगी। अपनी संरचना में, वह मध्य में एक वर्ष के लिए राशि आवंटित कर सकता है जहां आपका मानना ​​होगा कि सभी वस्तुओं के पास उचित क्रम में डेटा था। –

+0

हां, आपके उत्तर में, यह आवश्यक है कि सबकुछ क्रमबद्ध हो और क्रमबद्ध हो। मेरे मामले में ऐसे समय होते हैं जब यह क्रम में नहीं होता है। – Mike

+0

यही कारण है कि मैंने वर्षों को पकड़ने और उन्हें क्रमबद्ध करने के लिए डेटा के माध्यम से पहला पास सुझाया। डेटा को उचित कॉलम में असाइन करने के लिए दूसरा पास। – Ray

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