如何将具有一个键和多个值的列表绑定到GridView或Repeater

时间:2014-10-02 09:17:07

标签: c# asp.net asp.net-mvc-4

enter image description here

我正在将此列表转换为数据表

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

3 个答案:

答案 0 :(得分:4)

您可以在父网格视图或转发器中使用转发器或网格视图。

例如: -

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

        } 

答案 1 :(得分: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>

当您在字典中的List中存储具体对象时,可以使用<%# DataBinder.Eval(Container, "DataItem.EventDate")%>来访问属性(在此示例中使用名称EventDate)。 例如:Dictionary<string, List<Event>>

答案 2 :(得分:2)

我认为你必须要做的唯一事情是将动态数据表绑定到gridView,使用asp Gridview控件的内置属性 AutoGenerateColumns =& #34; true&#34 ;; 除非你确切知道要绑定的列,否则你必须使用GridView.RowDataBound Event

What is exactly this AutoGenerateColumns property ?

~ASP代码

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

假设myDatatable是从ConvertToDatatable方法返回的数据表对象。 ~C#代码:

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

希望它有所帮助!