使用子页脚行将新记录添加到嵌套网格视图

时间:2017-10-11 08:26:05

标签: c# asp.net gridview nested

我有一个嵌套的网格视图:

<asp:GridView ID="gvRequisitions" runat="server" AutoGenerateColumns="false"
                 DataKeyNames="PurchaseRequisitionID" OnRowDataBound="OnRowDataBound" ShowFooter="true">
    <Columns>
        <asp:TemplateField>
            <ItemTemplate>
                <img alt="" style="cursor:pointer" src="../images/plus.png" width="12" height="12" />
                <asp:Panel ID="pnlItems" runat="server" Style="display: none">
                    <asp:GridView ID="gvItems" runat="server" AutoGenerateColumns="false" ShowFooter="true"
                         OnRowDataBound="gvItems_RowDataBound">
                        <Columns>
                            <asp:TemplateField HeaderText="ID">
                                <ItemTemplate>
                                    <asp:Label ID="lblItemID" runat="server" Text='<%# Eval("ItemID") %>'></asp:Label>
                                </ItemTemplate>
                                <FooterTemplate>
                                    <asp:Button ID="btnAddItem" runat="server" OnClick="addItem" Text="add" />
                                </FooterTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Item Code">
                                <ItemTemplate>
                                    <asp:Label ID="lblItemCode" runat="server" Text='<%# Eval("ItemCode") %>'></asp:Label>
                                </ItemTemplate>
                                <FooterTemplate>
                                    <asp:TextBox ID="txtItemCode" runat="server" Visible="true" Width="100"></asp:TextBox>
                                </FooterTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Description">
                                <ItemTemplate>
                                    <asp:Label ID="lblDescription" runat="server" Text='<%# Eval("Description") %>'
                                         Width="225"></asp:Label>
                                </ItemTemplate>
                                <FooterTemplate>
                                    <asp:TextBox ID="txtDescription" runat="server" Width="225"></asp:TextBox>
                                </FooterTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Date req.">
                                <ItemTemplate>
                                    <asp:Label ID="lblDateRequired" runat="server" Text='<%# Eval("DateRequired") %>'
                                         Width="75"></asp:Label>
                                </ItemTemplate>
                                <FooterTemplate>
                                    <asp:TextBox ID="txtDateRequired" runat="server" Width="75"></asp:TextBox>
                                </FooterTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Measure">
                                <ItemTemplate>
                                    <asp:Label ID="lblMeasure" runat="server" Text='<%# Eval("MeasureID") %>'
                                         Width="120" ></asp:Label>
                                </ItemTemplate>
                                <FooterTemplate>
                                    <asp:DropDownList ID="ddlMeasure" runat="server" Width="120"></asp:DropDownList>
                                </FooterTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Qty">
                                <ItemTemplate>
                                    <asp:Label ID="lblQuantity" runat="server" Text='<%# Eval("Quantity") %>' Width="75"></asp:Label>
                                </ItemTemplate>
                                <FooterTemplate>
                                    <asp:TextBox ID="txtQuantity" runat="server" Width="75"></asp:TextBox>
                                </FooterTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Cost">
                                <ItemTemplate>
                                    <asp:Label ID="lblCostPerUnit" runat="server" Text='<%# Eval("CostPerUnit") %>' Width="75"></asp:Label>
                                </ItemTemplate>
                                <FooterTemplate>
                                    <asp:TextBox ID="txtCostPerUnit" runat="server" Width="75"></asp:TextBox>
                                </FooterTemplate>
                            </asp:TemplateField>
                            <asp:TemplateField HeaderText="Total">
                                <ItemTemplate>
                                    <asp:Label ID="lblTotal" runat="server" Text='<%# Eval("Total") %>' Width="120"></asp:Label>
                                </ItemTemplate>
                            </asp:TemplateField>
                        </Columns>
                        <EmptyDataTemplate>No Items For this Requisition</EmptyDataTemplate>
                    </asp:GridView>
                </asp:Panel>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="ID">
            <ItemTemplate>
                <asp:Label ID="lblPurchaseRequisitionID" runat="server" Text='<%# Eval("PurchaseRequisitionID") %>'>
                </asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:Button ID="btnAddReq" runat="server" Text="Add" OnClick="addPurreq" />
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Requested By">
            <ItemTemplate>
                <asp:Label ID="lblRequestor" runat="server" Text='<%# Eval("Requestor") %>'>
                </asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:DropDownList ID="ddlRequestor" runat="server" Width="200"></asp:DropDownList>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Department">
            <ItemTemplate>
                <asp:Label ID="lblDepartmentID" runat="server" Text='<%# Eval("DepartmentID") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:DropDownList ID="ddlDepartment" runat="server" Width="200" ></asp:DropDownList>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Budget">
            <ItemTemplate>
                <asp:Label ID="lblBudgetID" runat="server" Text='<%# Eval("BudgetID") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:DropDownList ID="ddlBudget" runat="server" Width="200"></asp:DropDownList>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Supplier">
            <ItemTemplate>
                <asp:Label ID="lblSupplierID" runat="server" Text='<%# Eval("SupplierID") %>'></asp:Label>
            </ItemTemplate>
            <FooterTemplate>
                <asp:DropDownList ID="ddlSupplier" runat="server" Width="200"></asp:DropDownList>
            </FooterTemplate>
        </asp:TemplateField>
        <asp:TemplateField HeaderText="Created">
            <ItemTemplate>
                <asp:Label ID="lblDateCreated" runat="server" Text='<%# Eval("DateCreated","{0:d}") %>'></asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>

在代码背后我有:

protected void OnRowDataBound(object sender, GridViewRowEventArgs e)
{
   if(e.Row.RowType == DataControlRowType.DataRow)
    {
        string purchaseRequisitionID = gvRequisitions.DataKeys[e.Row.RowIndex].Value.ToString();
        GridView gvItems = (GridView)e.Row.FindControl("gvItems");
        // new code to send reference to gvItems_RowDataBound
        gvItems.RowDataBound += new GridViewRowEventHandler(gvItems_RowDataBound);
        int id = Convert.ToInt32(purchaseRequisitionID);

        using (SqlConnection conn = new SqlConnection(constr))
        {
            using(SqlCommand comm = new SqlCommand("procItems_CRUD"))
            {
                comm.Parameters.AddWithValue("@Action", "SELECT");
                comm.Parameters.AddWithValue("@ID", id);
                using(SqlDataAdapter sda = new SqlDataAdapter())
                {
                    comm.CommandType = CommandType.StoredProcedure;
                    comm.Connection = conn;
                    sda.SelectCommand = comm;
                    using(DataTable dt = new DataTable())
                    {
                        sda.Fill(dt);
                        gvItems.DataSource = dt;
                        gvItems.DataBind();
                    }
                }
            }
        }
    }
}

protected void gvItems_RowDataBound(object sender, GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        DropDownList ddlMeasure = e.Row.FindControl("ddlMeasure") as DropDownList;
        if(ddlMeasure == null)
        {

        }
    }
}

但是我看不到下拉列表,因为它返回一个空值(因为我知道它不是DataRow)但我如何才能看到页脚行和页脚行中的元素,以便我可以添加另一个项目到订购/填充DropDownList等。

一直试图对此进行排序已经有一段时间了,无法找到可行的解决方案,因此非常感谢任何指针。

1 个答案:

答案 0 :(得分:0)

您需要使用DataControlRowType.Footer

protected void gvItems_RowDataBound(object sender, GridViewRowEventArgs e)
{
    //check if the row is a footer row
    if (e.Row.RowType == DataControlRowType.Footer)
    {
        DropDownList ddlMeasure = e.Row.FindControl("ddlMeasure") as DropDownList;

        if (ddlMeasure != null)
        {
            ddlMeasure.Items.Insert(0, new ListItem("DLL Found!", "-1"));
        }
    }
}