2014-10-02 76 views
4

enter image description here如何列表一個鍵和多個值綁定到一個GridView或中繼

,我有一個功能,該列表轉換爲數據表

public static DataTable ConvertToDatatable<T>(IList<T> data) 
     { 
      PropertyDescriptorCollection props = 
       TypeDescriptor.GetProperties(typeof(T)); 
      DataTable table = new DataTable(); 
      for (int i = 0; i < props.Count; i++) 
      { 
       PropertyDescriptor prop = props[i]; 
       table.Columns.Add(prop.Name, prop.PropertyType); 
      } 
      object[] values = new object[props.Count]; 
      foreach (T item in data) 
      { 
       for (int i = 0; i < values.Length; i++) 
       { 
        values[i] = props[i].GetValue(item); 
       } 
       table.Rows.Add(values); 
      } 
      return table; 
     } 

我應該怎麼做這些多值綁定到一箇中繼器或一個GridView

+1

1.爲什麼你需要創建一個DataTable,原始列表將自己綁定到Repeater/GridView? 2.你試圖做什麼來綁定它? – DavidG 2014-10-02 09:25:12

+0

將列表綁定到中繼器也不會工作sice它具有多個值.....我需要在我的中繼器中查看密鑰和其對應的值... – dennis 2014-10-02 10:02:31

+2

這裏有一個瘋狂的想法給你,但如果你翻轉數據源,以便輸出將您的密鑰綁定爲列,將您的密鑰綁定爲行,您將能夠將其直接綁定到gridview的數據源。 你用這種方式去打開它(這是我自己編造的單詞;-) – FlemGrem 2014-10-07 15:00:40

回答

4

你可以把父母的GridView或中繼器內的中繼器或GridView控件。

例如: -

 Dictionary<int, object> g = new Dictionary<int, object>() { { 1, new { j = "g" } }, { 2, new { j = "ggfdf" } }, { 3, new { j = "gioret" } } }; 


    gridviewparent.DataSource= g.Select(h => new {key= h.Key}); 
    gridviewparent.DataBind(); 



    foreach (GridViewRow item in gridviewparent.Rows) 
     { 
     int key= Convert.Toint32(((Label)item.FindControl("lblkey")).Text) ; 
       GridView gridviewChild=(GridView)item.FindControl("gridviewchild"); 
      // return g[key] in list 
      gridviewChild.DataSource= g[key]; 
      gridviewChild.DataBind(); 

     } 
3

你可以使用一箇中繼器的中繼器內。具體方法如下:

轉換你的名單分成一個Dictionary<string, List<object>>並存儲到一個屬性(我的樣品中它被命名爲Dict),可以通過.aspx文件(至少protected或更易於訪問)進行訪問。
然後在某個時候撥打outerRepeater.DataBind()(例如在您的Page_Load(object sender, EventArgs e)實施中)。

將這個到您.aspx文件,以使其工作:

<asp:Repeater runat="server" ID="outerRepeater" DataSource='<%# Dict.Keys%>'> 
<ItemTemplate> 
    <asp:Repeater runat="server" ID="innerRepeater" DataSource='<%# Dict[DataBinder.Eval(Container, "DataItem").ToString()]%>'> 
     <ItemTemplate> 
      <%# DataBinder.Eval(Container, "DataItem")%> 
     </ItemTemplate> 
    </asp:Repeater> 
</ItemTemplate> 

您可以使用<%# DataBinder.Eval(Container, "DataItem.EventDate")%>訪問屬性(在此示例中名爲EventDate)當您存儲在具體對象列表裏面的字典。 例如:Dictionary<string, List<Event>>

2

我認爲你唯一要做這裏,以綁定動態數據表到GridView,是使用內置的ASP GridView控件的AutoGenerateColumns =「真正的財產「;除非你確切地知道你要綁定的列,那麼你必須使用GridView.RowDataBound Event

What is exactly this AutoGenerateColumns property ?

〜ASP代碼

<asp:GridView ID="MyGridView" runat="server" AutoGenerateColumns = "true" ></asp:GridView> 

假設myDatatable是DataTable對象從ConvertToDatatable方法返回。 〜C#代碼:

MyGridview.DataSource = myDatatable;    
MyGridview.DataBind(); 

希望它能幫助!

相關問題