【问题标题】:UpdatePanel and refreshing RepeatersUpdatePanel 和刷新中继器
【发布时间】:2016-03-25 20:43:52
【问题描述】:

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

问题是在我的代码隐藏函数中找到那些其他控件。

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 之上?

然后我将更新面板从转发器中拉出,它会更新,但会刷新整个页面。我会满足于只更新页脚,但让那些添加/删除按钮在同一个更新面板中工作会很好。 我应该如何进行设置,以便刷新井中的内容?

根据要求;

<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>

【问题讨论】:

  • 你能告诉我们Repeater的相关标记,它的页脚和UpdatePanel吗?
  • @ConnorsFan 更新了 OP。显然,我已经修改了几次,但现在是这样的
  • UpdatePanel 实现为divspan,具体取决于RenderMode 属性(默认为div)。您不能在 &lt;tr&gt; 和它的 &lt;td&gt; 子代之间插入那种元素。

标签: asp.net updatepanel repeater findcontrol


【解决方案1】:

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

<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"

【讨论】:

  • 好吧,我会搞砸的。如果我还想更新添加/删除按钮,是否建议为井使用一个更新面板并将其放在中继器之外? (见截图)
  • 对不起,我不明白“井”是什么(我的英语有些有限)。如果您谈论您当前的页脚,它肯定会在中继器之外,因为它不显示通常在页脚中找到的总计或其他信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-18
  • 1970-01-01
相关资源
最近更新 更多