2011-01-26 22 views
10

मैं किसी सूची से कुछ मूल्य प्राप्त करने का प्रयास कर रहा हूं और फिर इस डेटा के साथ एक HTML तालिका बना रहा हूं लेकिन मैं इसे ठीक से काम नहीं कर सकता।किसी सूची से HTML तालिका बनाएं

मेरे पास है:

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

जब मैं डिबगर के माध्यम से कदम मैं देख सकता हूँ कि row.Cells.Add (सेल) दूसरे लूप लेकिन फिर कुछ में पहली पाश में परिवार का नाम और व्यक्ति का नाम शामिल लगता है कि गलत है और मैं इस डेटा के साथ पेज पर दिखाने के लिए टेबल नहीं प्राप्त कर सकता।

जब मैं table.rows.add (पंक्ति) की जांच में यह कहना है कि "base {System.SystemException} = {"'HtmlTableRow' does not support the InnerText property."}"

क्या मैं गलत यहाँ कर रहा हूँ?

+0

एक असंबंधित सवाल है, लेकिन क्या आप भीतरी foreach छोरों में करने के लिए कोशिश कर रहे हैं? आप वहां इटेटरेटर चर का उपयोग नहीं करते हैं (familyName, givenName)। –

+0

हाय, यह एक गलती थी, अब इसे बदल दिया, धन्यवाद। – peter

+3

आपको शायद इसे दोहराने वाले के साथ करना चाहिए ... –

उत्तर

10

मैंने आपके कोड से कदम बढ़ाया है और मैं आपके द्वारा उल्लिखित त्रुटि को दोहराना नहीं कर सकता।

यह सुनिश्चित करने के लिए कहना मुश्किल है अपने डेटा संरचना 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 + "&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. 
    } 
} 

एचटीएच।

पूर्ण कोड

<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

क्या एक व्यापक जवाब है, बहुत बहुत धन्यवाद। – peter

+1

कोई जांच नहीं। उम्मीद है कि यह इस मुद्दे को हल करता है। शिष्टाचार के लिए +1 बिंदु :-) – 5arx

संबंधित मुद्दे