करने के लिए अपने name_data सूची बाध्य करने के लिए सक्षम होना चाहिए। इस तरह मार्कअप के साथ शुरू करें।
<table>
<tr class="headerRow">
<td> </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();
}
शुभकामनाएं।
मुझे इसे उप-कुल और ग्रैंड कुल पंक्तियों के लिए कई नेस्टेड रिपियटर्स के साथ खींचना पड़ा है। मैंने अपनी नींद में नेस्टेड रिपियटर्स को देखना शुरू कर दिया।
क्या मैं <हेडर टेम्पलेट> टैग में एक नेस्टेड रिपेटर डाल सकता हूं? – Mike