2011-01-26 38 views
10

Tôi đang cố gắng lấy một số giá trị từ Danh sách rồi tạo bảng html với dữ liệu này nhưng tôi không thể làm cho nó hoạt động bình thường.Tạo bảng HTML từ danh sách

tôi có:

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); 

Khi tôi bước qua debugger Tôi có thể thấy rằng row.Cells.Add (cell) chứa tên gia đình trong vòng lặp đầu tiên và tên được đặt trong vòng lặp thứ hai nhưng sau đó một cái gì đó có vẻ sai và tôi không thể hiển thị bảng trên trang có dữ liệu này.

Khi tôi kiểm tra table.rows.add (hàng) nó nói rằng "base {System.SystemException} = {"'HtmlTableRow' does not support the InnerText property."}"

Tôi đang làm gì sai ở đây?

+0

Một câu hỏi không liên quan, nhưng những gì bạn đang cố gắng để làm trong các vòng foreach bên trong? Bạn không sử dụng các biến lặp có (familyName, givenName). –

+0

Xin chào, đó là một sai lầm, thay đổi nó ngay bây giờ, cảm ơn. – peter

+3

Có lẽ bạn nên làm điều này với bộ lặp lại ... –

Trả lời

10

Tôi đã thực hiện xong mã của bạn và tôi không thể sao chép lỗi mà bạn đề cập.

Thật khó để nói chắc chắn mà không thấy bạn cấu trúc dữ liệu Name nhưng một vài quan sát:

I. Nếu familyName là một chuỗi, bạn bên foreach sẽ thực hiện một lần cho mỗi nhân vật trong chuỗi. Điều này có thể không là những gì bạn muốn vì nó sẽ xuất ra một họ x số lần x = surname.length.

Điều này sẽ dẫn đến số lượng ô không bằng nhau của mỗi hàng trừ khi tất cả họ của bạn có cùng độ dài.

Vì vậy, tôi sẽ nói thoát khỏi

foreach(var familyName in item.familyName){...} 

vòng lặp và chỉ để lại các mã bên trong nên nó sẽ ra họ chỉ một lần.

II. Tôi là đoán rằng item.givenName là một mảng hoặc bộ sưu tập, ví dụ: Danh sách <> của chuỗi? Nếu vậy bạn chỉ có thể sử dụng

cell.InnerText = givenName; 

Lưu ý rằng đây là sẽ vẫn cung cấp cho bạn số không đồng đều của các tế bào bảng mỗi hàng vì người có số lượng khác nhau của forenames ;-)

Có nói rằng bạn thực sự nên để sử dụng các điều khiển tích hợp để thực hiện loại điều này - Bộ lặp có lẽ là cách để đi.

Ví dụ:

Markup

<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

lẽ kích hoạt bởi Page_Load - chỉ ràng buộc lặp lại của bạn để Name sưu tập của bạn:

rptNames.DataSource = Name; 

rptNames.DataBind(); 

Để sản lượng s GivenName bạn sử dụng Mục Sự kiện DataBound được gọi cho mỗi hàng của bộ lặp:

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 + "&nbsp;";   //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. 
    } 
} 

HTH.

Full Mã

<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

Câu trả lời mở rộng là gì, cảm ơn bạn rất nhiều. – peter

+1

Không có probs. Hy vọng nó sắp xếp ra (các) vấn đề. Điểm +1 cho lịch sự :-) – 5arx

Các vấn đề liên quan