UpdatePanel和刷新中继器

时间:2016-03-25 20:43:53

标签: asp.net updatepanel repeater findcontrol

我有一个显示产品的转发器,页脚是输入字段,您可以从数据库中选择产品并将其添加到转发器。页脚中添加行的第一个字段是RadComboBox(带有产品名称),我想在该组合框的SelectedIndexChanged时使用db中的信息更新其他输入字段。

问题是在我的代码隐藏功能中找到其他控件。

protected void ProductSelected(Object source, EventArgs e) 
    {
        RadComboBox temp = (RadComboBox)source;

        Product p = session.Query<Product>()
            .Where(x => x.Name == temp.SelectedItem.Text)
            .FirstOrDefault();


            var repParent = temp.Parent;
            //var repParent = ((UpdatePanel)temp.NamingContainer.FindControl("UpdateHardwareLine")).ContentTemplateContainer;

            ((TextBox)repParent.FindControl("AddPartNumber")).Text = p.PartNumber;
            ((TextBox)repParent.FindControl("AddPartCost")).Text = p.Cost.ToString();
            ((TextBox)repParent.FindControl("AddUnitPrice")).Text = p.Price.ToString();
            ((TextBox)repParent.FindControl("AddQuantity")).Text = p.DefaultQuantity.ToString();

    }

我已尝试过这两种方式。首先,我将UpdatePanel放在转发器的页脚中,然后将repParent更改为注释版本。这产生了一些非常奇怪的结果,它更新了输入字段,但现在它们超过了我的整个转发器o_0?

UpdatePanel 'working'

然后我将更新面板从转发器中取出,然后更新,但它会刷新整个页面。我只想更新页脚,但是在同一个更新面板中使用这些添加/删除按钮是很整洁的。 我应该如何进行设置,以便只是刷新这个井中的什么?

按要求;

<asp:Repeater ID="repHW" runat="server" OnItemCommand="rep_ItemCommand">
        <HeaderTemplate>
            <table style="width:100%; padding-bottom:10px" id="HWtable">
                <tr style="font-weight: bold"><td>Product</td><td>Part Number</td><td>Cost</td><td>Unit Price</td><td>Quantity</td><td>Price</td><td>Delete</td></tr>
        </HeaderTemplate>
        <ItemTemplate>
            <tr>
                <asp:HiddenField ID="Category" Value="Hardware" runat="server"/>
                <td><asp:Label ID="Product" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Product.Name") %>' /></td> <!--TODO: make this clickable to edit -->
                <td><asp:Label ID="PartNumber" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Product.PartNumber") %>' /></td>
                <td><asp:Label ID="PartCost" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Product.Cost") %>' /></td>
                <td><asp:Label ID="UnitPrice" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "Product.Price") %>' /></td>
                <td><asp:Label ID="Quantity" runat="server" Text='<%# Eval("Quantity") %>' /></td>
                <td><asp:Label ID="Price" runat="server" Text='<%# Eval("Total") %>' /></td>
                <td><asp:Button class="btn btn-danger" ID="DeleteHardware" runat="server" Text="Delete" CommandName="Delete" CommandArgument='<%# Container.ItemIndex %>'/></td>
            </tr>
        </ItemTemplate>
        <FooterTemplate>
            <tr>
                <asp:UpdatePanel ID="UpdateHardwareLine" updatemode="Conditional" runat="server" ChildrenAsTriggers="true">
                    <Triggers>
                        <asp:AsyncPostBackTrigger ControlID="AddProduct" EventName="SelectedIndexChanged" />
                    </Triggers>
                    <ContentTemplate>
                        <asp:HiddenField ID="AddCategory" Value="Hardware" runat="server"/>
                        <td><telerik:RadComboBox runat="server" ID="AddProduct" ClientIDMode="static" Filter="Contains" EnableLoadOnDemand="true" AutoPostBack="true" OnSelectedIndexChanged="ProductSelected" OnDataBinding="LoadProductsByCategory"/></td>
                        <td><asp:TextBox runat="server" ID="AddPartNumber" ClientIDMode="static"/></td>
                        <td><asp:TextBox runat="server" ID="AddPartCost" ClientIDMode="static"/></td>
                        <td><asp:TextBox runat="server" ID="AddUnitPrice" ClientIDMode="static"/></td>
                        <td><asp:TextBox runat="server" ID="AddQuantity" ClientIDMode="static"/></td>
                        <td><asp:Button class="btn btn-success" ID="AddHardware" runat="server" Text="Add" CommandName="Add" CommandArgument='<%# DataBinder.Eval(Container, "ItemIndex") %>' onClientClick="return EmptyFieldCheck('Hardware');"/></td>
                    </ContentTemplate>
                </asp:UpdatePanel>
            </tr></table>    
        </FooterTemplate>
    </asp:Repeater>

1 个答案:

答案 0 :(得分:0)

您可以在单独的表格中显示页脚的内容。像这样:

<FooterTemplate>
    <tr>
        <td colspan="7">
            <asp:UpdatePanel ID="UpdateHardwareLine" updatemode="Conditional" runat="server" ChildrenAsTriggers="true">
                <Triggers>
                    <asp:AsyncPostBackTrigger ControlID="AddProduct" EventName="SelectedIndexChanged" />
                </Triggers>
                <ContentTemplate>
                    <table style="width:100%;">
                        <tr>
                            <asp:HiddenField ID="AddCategory" Value="Hardware" runat="server"/>
                            <td><telerik:RadComboBox runat="server" ID="AddProduct" ClientIDMode="static" Filter="Contains" EnableLoadOnDemand="true" AutoPostBack="true" OnSelectedIndexChanged="ProductSelected" OnDataBinding="LoadProductsByCategory"/></td>
                            ...
                        </tr>
                  </table>
                </ContentTemplate>
            </asp:UpdatePanel>
        </td>
    </tr>
</FooterTemplate>

挑战是让内部桌子与外部桌子正确对齐。作为第一步,您可能需要为两个表设置CellPadding="0"CellSpacing="0"