来自asp.net中嵌套列表的嵌套GridView

问题描述

我有一个员工列表,其中每个列表项还包含他们访问不同部门的时间(地点)列表。

我想在GridView(ID:GridView1)中显示数据,该数据包含ID和Name的BoundField列以及嵌套GridView(ID:GridView2)的TemplateField列,该列将显示部门列表,班次和时间。

    public class PunchInfo
    {
        public string DepartmentName { get; set; }
        public int Shift { get; set; } 
        public DateTime Time { get; set; }
    }

    public class Employees
    {
        public string Id { get; set; }
        public string Name { get; set; }
        public List<PunchInfo> Punches { get; set; }
    }

我想在.cs文件中执行此操作,但是我不知道如何将数据绑定到网格。

            /* EmployeeList is List<Employees> */
            GridView1.DataSource = EmployeeList;  
            GridView gv2 = GridView1.FindControl("GridView2") as GridView;
            /* How to bind the EmployeeList[row_idx].Punches to the nested GridView2 object? */
            GridView1.DataBind();

谢谢

解决方法

您不需要FindControl GridView2,只需在DataSource中添加.aspx元素

我的可行示例:

.aspx

<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False">
 <Columns>
     <asp:TemplateField HeaderText="Id">
         <ItemTemplate>
            <asp:Label ID="Label1" runat="server" Text='<%# Eval("Id") %>'></asp:Label>
        </ItemTemplate>
     </asp:TemplateField>
     <asp:TemplateField HeaderText="Name">
        <ItemTemplate>
            <asp:Label ID="Label2" runat="server" Text='<%# Eval("Name") %>'></asp:Label>
        </ItemTemplate>
     </asp:TemplateField>
     <asp:TemplateField HeaderText="Puches">
        <ItemTemplate>
            <asp:GridView ID="DetailGridView" runat="server" AutoGenerateColumns="False" DataSource='<%# Eval("Punches") %>'>
                 <Columns>
                     <asp:TemplateField HeaderText="Department Name">
                         <ItemTemplate>
                            <asp:Label ID="Label3" runat="server" Text='<%# Eval("DepartmentName") %>'></asp:Label>
                        </ItemTemplate>
                     </asp:TemplateField>
                     <asp:TemplateField HeaderText="Shift">
                        <ItemTemplate>
                            <asp:Label ID="Label4" runat="server" Text='<%# Eval("Shift") %>'></asp:Label>
                        </ItemTemplate>
                     </asp:TemplateField>
                     <asp:TemplateField HeaderText="Time">
                        <ItemTemplate>
                            <asp:Label ID="Label5" runat="server" Text='<%# Eval("Time") %>'></asp:Label>
                        </ItemTemplate>
                     </asp:TemplateField>
                 </Columns>
             </asp:GridView>
        </ItemTemplate>
     </asp:TemplateField>
 </Columns>
</asp:GridView>

.aspx.cs

protected void Page_Load(object sender,EventArgs e)
{
    if (!IsPostBack)
    {
        var employees = new List<Employees>
        {
            new Employees()
            {
                Id = "1",Name = "E1",Punches = new List<PunchInfo>()
                {
                    new PunchInfo()
                    {
                        DepartmentName = "D1",Shift = 1,Time = DateTime.Now
                    },new PunchInfo()
                    {
                        DepartmentName = "D2",Shift = 2,}
            },new Employees()
            {
                Id = "2",Name = "E2",Punches = new List<PunchInfo>()
                {
                    new PunchInfo()
                    {
                        DepartmentName = "D3",Shift = 3,new PunchInfo()
                    {
                        DepartmentName = "D4",Shift = 4,}
            }
        };

        GridView2.DataSource = employees;
        GridView2.DataBind();
    }
}