2012-11-16 8 views
7

मैं एक HTML तालिका बनाने के लिए एक HTMLHelper बनाना चाहता हूं। मैं चाहता हूं कि सहायक किसी भी प्रकार की वस्तु और सूची के रूप में प्रदर्शित करने के लिए ऑब्जेक्ट के गुणों की एक सूची लेने में सक्षम हो। इस तरह कुछ:जेनेरिक एचटीएमएल हेल्पर किसी भी प्रकार की सूची से एचटीएमएल टेबल बनाने के लिए

public static HtmlString Table(this HtmlHelper helper, List<T> data, List<string> headers) 
    { 
     //Tags 
     TagBuilder table = new TagBuilder("table"); 
     TagBuilder tr = new TagBuilder("tr"); 
     TagBuilder td = new TagBuilder("td"); 
     TagBuilder th = new TagBuilder("th"); 

     //Inner html of table 
     StringBuilder sb = new StringBuilder(); 

     //Add headers 
     foreach (var s in headers) 
     { 
      th.InnerHtml = s; 
      tr.InnerHtml += th.ToString(); 
     } 
     sb.Append(tr.ToString()); 

     //Add data 
     foreach (var d in data) 
     { 
      tr.InnerHtml = ""; 
      foreach (var h in headers) 
      { 
       td.InnerHtml = d.h.ToString(); 
       tr.InnerHtml += td.ToString(); 
      } 
      sb.Append(tr.ToString()); 
     } 

     table.InnerHtml = sb.ToString(); 
     return new HtmlString(table.ToString()); 
    } 

यह कोड निश्चित रूप से काम नहीं करेगा, लेकिन मुझे आश्चर्य है कि क्या ऐसा कुछ करना संभव होगा? और मैं ऐसा करने के बारे में कैसे जा सकता हूं।

संपादित करें:

मैं निम्नलिखित समाधान चुना है, विचार था कि तालिका केवल तत्वों हेडर सूची में निर्दिष्ट शामिल करना चाहिए, तो यह है कि क्या मैं के साथ आया था:

public static HtmlString Table<T>(this HtmlHelper helper, List<T> data, List<string> headers) 
{ 
    //Tags 
    TagBuilder table = new TagBuilder("table"); 
    TagBuilder tr = new TagBuilder("tr"); 
    TagBuilder td = new TagBuilder("td"); 
    TagBuilder th = new TagBuilder("th"); 

    //Inner html of table 
    StringBuilder sb = new StringBuilder(); 

    //Add headers 
    foreach (var s in headers) 
    { 
     th.InnerHtml = s; 
     tr.InnerHtml += th.ToString(); 
    } 
    sb.Append(tr.ToString()); 

    //Add data 
    foreach (var d in data) 
    { 
     tr.InnerHtml = ""; 
     foreach (var h in headers) 
     { 
      td.InnerHtml = d.GetType().GetProperty(h).GetValue(d, null).ToString(); 
      tr.InnerHtml += td.ToString(); 
     } 
     sb.Append(tr.ToString()); 
    } 

    table.InnerHtml = sb.ToString(); 
    return new HtmlString(table.ToString()); 
} 
+0

यदि आप मानते हैं कि आपकी 'सूची ' में 'टी' मानचित्र 'सार्वजनिक गुणों' के माध्यम से शीर्षलेखों के लिए हैं तो आप आरामदायक होंगे? – LukeHennerley

+0

विचार यह है कि एक हेडर टी की एक सार्वजनिक संपत्ति से मेल खाता है। इसलिए मुझे लगता है कि जवाब हाँ है। – Marius

उत्तर

8
public HtmlTable BuildTable<T>(List<T> Data) 
{ 
    HtmlTable ht = new HtmlTable(); 
    //Get the columns 
    HtmlTableRow htColumnsRow = new HtmlTableRow(); 
    typeof(T).GetProperties().Select(prop => 
             { 
              HtmlTableCell htCell = new HtmlTableCell(); 
              htCell.InnerText = prop.Name; 
              return htCell; 
             }).ToList().ForEach(cell => htColumnsRow.Cells.Add(cell)); 
    ht.Rows.Add(htColumnsRow); 
    //Get the remaining rows 
    Data.ForEach(delegate(T obj) 
    { 
    HtmlTableRow htRow = new HtmlTableRow(); 
    obj.GetType().GetProperties().ToList().ForEach(delegate(PropertyInfo prop) 
    { 
     HtmlTableCell htCell = new HtmlTableCell(); 
     htCell.InnerText = prop.GetValue(obj, null).ToString(); 
     htRow.Cells.Add(htCell); 
    }); 
    ht.Rows.Add(htRow); 
    }); 
    return ht; 
} 

इसे आज़माएं। आपको BuildTable<YourType>(list) पर कॉल करने की आवश्यकता है।

+0

बिल्कुल वही नहीं जो मैं खोज रहा था, लेकिन पर्याप्त बंद करें। यह मुझे सही रास्ते पर मिला। अंतिम समाधान के लिए मेरा संपादन देखें। – Marius

+0

@ मारिस निश्चित रूप से ऊपर दिया गया कोड अधिक कुशल/पर्याप्त है? आपको केवल उपर्युक्त कोड में एक विधि को पास करना होगा और यह वही चीज़ प्राप्त करता है जो यह नहीं करता है? जब तक यह आपको मदद करता है कि आपको यह ठंडा करने के लिए कहां जाना चाहिए :) – LukeHennerley

+0

@ मैरियस मैं देखता हूं कि आप केवल विशिष्ट शीर्षलेख चाहते हैं, जो शुरुआत में स्पष्ट नहीं था, मैंने सोचा था कि आप सभी गुण चाहते थे। यदि आप चाहते हैं कि मैं ऐसा करने के लिए इसे दोबारा कर दूं, तो मैं करूँगा? – LukeHennerley

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