मैंने आपके कोड से कदम बढ़ाया है और मैं आपके द्वारा उल्लिखित त्रुटि को दोहराना नहीं कर सकता।
यह सुनिश्चित करने के लिए कहना मुश्किल है अपने डेटा संरचना Name
देखे बिना लेकिन टिप्पणियों के एक जोड़े:
आई तो familyName
एक स्ट्रिंग है, अपने भीतर foreach
स्ट्रिंग में हर किरदार के लिए एक बार निष्पादित करेंगे। यह नहीं हो सकता है जो आप चाहते हैं क्योंकि यह एक उपनाम x संख्या का उत्पादन करेगा जहां x = surname.length।
इसके परिणामस्वरूप प्रति पंक्ति तालिका कक्षों की असमान संख्याएं न हो जाएंगी जब तक कि आपके सभी उपनाम समान लंबाई न हों।
तो मैं कहना
foreach(var familyName in item.familyName){...}
पाश से छुटकारा पाने के हैं और सिर्फ यह उत्पादन उपनाम सिर्फ एक बार हूँ तो अंदर कोड छोड़ दें।
II। मैं अनुमान है कि item.givenName
एक सरणी या संग्रह है उदा। तारों की <> सूची? यदि ऐसा है तो आप सिर्फ इस्तेमाल कर सकते हैं
cell.InnerText = givenName;
नोट इस अभी भी होगा आप प्रति पंक्ति तालिका सेल की असमान संख्या देना है क्योंकि लोगों की forenames ;-)
करने के बाद कहा कि अलग अलग संख्या है कि कि तुम सच में चाहिए इस तरह की चीज करने के लिए अंतर्निहित नियंत्रणों का उपयोग करने के लिए - रिपेटर शायद जाने का रास्ता है।
उदा।
मार्कअप
<asp:Repeater runat="server" id="rptNames" onItemDataBound="rptName_ItemDataBound" >
<HeaderTemplate>
<table>
<tr>
<td>Given Name(s)</td>
<td>Family Name</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("FamilyName") %></td>
<td>
<asp:Label runat="server" id="lGivenNames" />
</td>
</tr>
<ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
codebehind
शायद Page_Load
से शुरू हो रहा - बस अपने Name
संग्रह करने के लिए अपने पुनरावर्तक बाँध:
rptNames.DataSource = Name;
rptNames.DataBind();
उत्पादन करने के लिए
GivenName
रों आप उपयोग
मद डेटाबाउंड घटना जिसे दोहराने की प्रत्येक पंक्ति के लिए बुलाया जाता है:
protected void rptNames_ItemDataBound(object sender, RepeaterItemEventArgs e){
//Not interested the Header and Footer rows
if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem){
Label l = ((Label)e.Item.FindControl("lGivenNames"));
string[] arrGivenNames = ((FullName)e.Item.DataItem).GivenNames;
foreach (string n in arrGivenNames){//could use a StringBuilder for a performance boost.
l.Text += n + " "; //Use a regular space if using it for Winforms
}
//For even slicker code, replace the Label in your repeater with another repeater and bind to that. Google `nested repeater` for a how to.
}
}
एचटीएच।
पूर्ण कोड
<h2>Doing it by hand - manually building up an HTML Table</h2>
<asp:Panel runat="server" ID="pnl1">
</asp:Panel>
<h2>With a Repeater</h2>
<asp:Repeater runat="server" id="rptNames" onItemDataBound="rptName_ItemDataBound" >
<HeaderTemplate>
<table border="1" style="border-color:Red;">
<tr>
<td>Given Name(s)</td>
<td>Family Name</td>
</tr>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td><%# Eval("FamilyName") %></td>
<td>
<asp:Label runat="server" id="lGivenNames" />
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</table>
</FooterTemplate>
</asp:Repeater>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace Testbed.WebControls
{
internal class FullName{
public string FamilyName{get;set;}
public string[] GivenNames{get;set;}
public FullName(){
}
public FullName(string[] _givenNames, string _familyName)
{
FamilyName = _familyName;
GivenNames = _givenNames;
}
}
public partial class HTMLTables : System.Web.UI.Page
{
List<FullName> Name;
protected void Page_Load(object sender, EventArgs e)
{
this.Name = new List<FullName>();
Name.Add(new FullName(new string[]{"Kylie"},"Minogue"));
Name.Add(new FullName(new string[]{"Angelina", "Kate", "Very-Lovely"}, "Jolie"));
Name.Add(new FullName(new string[]{"Audrey", "Veronica"},"Hepburn"));
HtmlTable table = new HtmlTable();
table.Border = 1;
HtmlTableRow row;
HtmlTableCell cell;
row = new HtmlTableRow();
cell = new HtmlTableCell();
cell.InnerText = "Given Name";
row.Cells.Add(cell);
cell = new HtmlTableCell();
cell.InnerText = "Family Name";
row.Cells.Add(cell);
foreach (var item in Name)
{
row = new HtmlTableRow();
//foreach (var familyName in item.FamilyName){
cell = new HtmlTableCell();
cell.InnerText = item.FamilyName.ToString();
row.Cells.Add(cell);
//}
foreach (string givenName in item.GivenNames)
{
cell = new HtmlTableCell();
cell.InnerText = givenName.ToString();
row.Cells.Add(cell);
}
table.Rows.Add(row);
}
this.pnl1.Controls.Add(table);
//Or do it with a repeater
rptNames.DataSource = Name;
rptNames.DataBind();
}
//This gets called everytime a data object gets bound to a repeater row
protected void rptName_ItemDataBound(object sender, RepeaterItemEventArgs e){
switch(e.Item.ItemType){
case ListItemType.Item:
case ListItemType.AlternatingItem:
string[] arrGivenNames = ((FullName)e.Item.DataItem).GivenNames;
foreach(string n in arrGivenNames){
((Label)e.Item.FindControl("lGivenNames")).Text += n + @" ";
}
break;
default:
break;
}
}
}
}
एक असंबंधित सवाल है, लेकिन क्या आप भीतरी foreach छोरों में करने के लिए कोशिश कर रहे हैं? आप वहां इटेटरेटर चर का उपयोग नहीं करते हैं (familyName, givenName)। –
हाय, यह एक गलती थी, अब इसे बदल दिया, धन्यवाद। – peter
आपको शायद इसे दोहराने वाले के साथ करना चाहिए ... –