Kodunuzu değiştirdim ve bahsettiğiniz hatayı çoğalamıyorum.
Bu sizin veri yapısını Name
görmeden kesin söylemek zor ama gözlemlerin birkaç:
I. familyName
ise İçinizdeki foreach
dizedeki her karakter için bir defa çalıştırılır bir dizedir. Bu , bir soyadı x çıkışının x = soyadı.length olduğu zaman çıktı olarak istediğinizi değil olmayabilir.
Bu, tüm soyadlarınız aynı uzunlukta olmadıkça, satır başına eşit sayıda tablo hücresi ile sonuçlanır.
yüzden
foreach(var familyName in item.familyName){...}
döngü kurtulmak derdim ve sadece çıkış soyadı sadece bir kez olacak bu yüzden içinde kod bırakın.
II. Ben tahmin ediyorum item.givenName
bir dizi veya koleksiyon örn. <> dizi dizeleri? yüzden sadece bu insanların soyadı kısaltılmadan ;-)
söyledikten sonra farklı sayıda var çünkü hala olacak size satır başına tablo hücrelerinin düzensiz numaralarını vermek olduğunu
cell.InnerText = givenName;
Not kullanabilirsiniz Eğer bu gerçekten gerektiğini Bu tür şeyleri yapmak için yerleşik kontrolleri kullanmak - Tekrarlayıcı muhtemelen gitmek için bir yoldur.
E.g.
Biçimlendirme
<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 Muhtemelen Page_Load
tarafından tetiklenen
- Sadece Name
koleksiyona tekrarlayıcı bağlamak: GivenName
s kullandığınız çıktı için
rptNames.DataSource = Name;
rptNames.DataBind();
madde Yineleyicinin her satırı için çağrılan DataBound olayı:
HTH.
Tam Kod
<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;
}
}
}
}
bir ilişkisiz bir soru, ama ne iç foreach döngüsünden içinde yapmaya çalışıyorsun? Yineleyici değişkenlerini orada kullanmazsınız (familyName, givenName). –
Merhaba, bu bir hataydı, şimdi değişti, teşekkürler. – peter
Muhtemelen bunu bir tekrarlayıcı ile yapıyor olmalısınız ... –