2012-11-16 12 views
7

Bir html tablosu oluşturmak için bir HtmlHelper oluşturmak istiyorum. Yardımcıların herhangi bir nesne türünün bir listesini ve sütun olarak görüntülenecek nesnenin özelliklerinin bir listesini alabilmesini isterim. Böyle bir şey:Herhangi bir tür listeden html tablosu oluşturmak için kullanılan Genel 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()); 
    } 

Bu kod elbette işe yaramıyor, ama benzer bir şey yapmanın mümkün olup olmayacağını merak ediyorum. Ve bunu nasıl yapacağım?

DÜZENLEME:

aşağıdaki çözümü seçti fikri i ile geldi tablo sadece başlıklar listesinde belirtilen unsurları içermelidir, bu da öyle oldu:

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

Eğer "T", "public properties" aracılığıyla başlıkları eşleştirdiği "List Listenizde" olduğunu düşünürsek rahat edersiniz? – LukeHennerley

+0

Fikir, bir başlığın T.'nin bir kamu mülküne tekabül etmesidir. Bu yüzden cevabın evet olduğunu düşünüyorum. – Marius

cevap

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

Bunu deneyin. BuildTable<YourType>(list)'u aramanız gerekiyor.

+0

Tam olarak aradığım şey değil, ama yeterince yakın. Beni doğru yolda yakaladı. Son çözüm için benim düzenime bakın. – Marius

+0

@Maris Yukarıdaki kod kesinlikle daha verimli/yeterli mi? Yöntemi yukarıdaki kodda sadece bir listeyi geçmek zorundasınız ve aynı şeyi başarır mı? Bu kadar iyi gitmek istediğiniz yere varmanıza yardımcı olduğu sürece :) :) – LukeHennerley

+0

@Marius Sadece belirli başlıkları istediğinizi görüyorum, başlangıçta net olmayan tüm özellikleri istediğinizi düşündüm. Bunu yapmak için bunu tekrar düzenlememi istiyorsan, yapacağım? – LukeHennerley

İlgili konular