2011-01-26 22 views
10

Bir Listeden bazı değerler almaya çalışıyorum ve bu verilerle bir html tablosu oluşturmaya çalışıyorum ancak düzgün çalışmasını sağlayamıyorum.Bir listeden HTML tablosu oluşturma

Ben: Ben ayıklayıcıya adım zaman ben row.Cells.Add (hücre) daha sonra ikinci döngü ama bir şey aile ilk döngü içinde adı ve verilen ad içerdiğini görebilirsiniz

HtmlTable table = new HtmlTable(); 
HtmlTableRow row; 
HtmlTableCell 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 (var givenName in item.givenName) 
    { 
     cell = new HtmlTableCell(); 
     cell.InnerText = item.givenName.ToString(); 
     row.Cells.Add(cell); 
    } 

    table.Rows.Add(row); 
} 
this.Controls.Add(table); 

yanlış görünüyor ve bu verilerle sayfada görünmesi için tabloyu alamıyorum. Bunun söylüyor table.rows.add (satır) işaretlediğinizde

"base {System.SystemException} = {"'HtmlTableRow' does not support the InnerText property."}"

yanlış burada ne yapıyorum?

+0

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). –

+0

Merhaba, bu bir hataydı, şimdi değişti, teşekkürler. – peter

+3

Muhtemelen bunu bir tekrarlayıcı ile yapıyor olmalısınız ... –

cevap

10

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 + @"&nbsp;"; 
         } 
        break; 

        default: 

        break; 
       } 
      } 
     } 
    } 
+2

Ne kadar kapsamlı bir cevap, çok teşekkür ederim. – peter

+1

Probs yok. Umarım sorunu çözer. Nezaket :-) için +1 puan – 5arx

İlgili konular