在中继器中获取正确的控制/更新面板的问题

Posted

技术标签:

【中文标题】在中继器中获取正确的控制/更新面板的问题【英文标题】:Issue grabbing correct control/update panel in repeater 【发布时间】:2018-03-02 01:47:11 【问题描述】:

当下拉列表控件位于中继器内时,我遇到了动态更新它的问题。

基本上我有一个中继器,中继器内部有 2 个下拉列表。一个列表在我的 aspx 页面中定义,另一个下拉列表位于更新面板内,我希望能够根据第一个下拉列表的选择动态更新它。我认为我的部分问题是更新面板变得混乱,因为我有多个转发器项目?

这是我的中继器的代码:

<asp:Repeater ID="billingTemplate" runat="server" OnItemDataBound="template_ItemDataBound">
    <ItemTemplate>
        <tr style="font-size: 100%" runat="server">
            <td colspan="4" style="width: 100%; vertical-align: top">
                <div class="panel panel-default panel-billing">
                    <asp:Panel CssClass="row panel-heading panel-heading-billing text-left" ID="headingBilling" ClientIDMode="Static" runat="server">
                        <div class="col-xs-1">
                            <input type="hidden" id="templateUK" runat="server" value='<%#Eval("templateUK")%>' />
                            <a href="#collapseBilling" id="BillingPanelBtn" clientidmode="Static" class="btn btn-block btn-group-xs panel-button glyphicon glyphicon-chevron-down" data-toggle="collapse" runat="server"></a>
                        </div>
                        <div class="col-sm-3">
                            <label for="ddlInvFilterType" class="col-sm-4 control-label text-right labelCls testclass">Filter Type:</label>
                            <div class="col-sm-8">
                                <asp:DropDownList runat="server" ID="ddlInvFilterType" ClientIDMode="Static" placeholder="Choose Filter Type" CssClass="form-control smallSize FilterType" AutoPostBack="true" OnSelectedIndexChanged="ddlFilterType_SelectedIndexChanged">
                                    <asp:ListItem Value="">- None -</asp:ListItem>
                                    <asp:ListItem Value="RevType1">Revenue Type 1</asp:ListItem>
                                    <asp:ListItem Value="RevType2">Revenue Type 2</asp:ListItem>
                                    <asp:ListItem Value="RevType3">Revenue Type 3</asp:ListItem>
                                    <asp:ListItem Value="ServiceTeams">Service Team</asp:ListItem>
                                </asp:DropDownList>
                            </div>
                        </div>
                        <asp:UpdatePanel ID="InvFilterValuePanel" ClientIDMode="Static" runat="server" UpdateMode="Conditional" ChildrenAsTriggers="false">
                            <ContentTemplate>
                                <div class="col-sm-3">
                                    <label for="ddlInvFilterValue" class="col-sm-4 control-label text-right labelCls">Filter Value:</label>
                                        <div class="col-sm-8">
                                            <asp:DropDownList runat="server" ID="ddlInvFilterValue" ClientIDMode="Static" placeholder="Choose Filter Value" CssClass="col-sm-6 form-control smallSize">
                                                <asp:ListItem Value="">- None -</asp:ListItem>
                                            </asp:DropDownList>
                                        </div>
                                </div>
                            </ContentTemplate>
                            <Triggers>
                                <asp:AsyncPostBackTrigger ControlID="ddlInvFilterType" EventName="SelectedIndexChanged" />
                            </Triggers>
                        </asp:UpdatePanel>
                    </asp:Panel>
                    <asp:Panel CssClass="panel-collapse collapse" ID="collapseBilling" ClientIDMode="Static" runat="server">
                        <div class="panel-body">
                            <table class="table table-condensed table-bordered" style="margin: 0; padding: 0; border-top: none; border-bottom: none; border-left: thin; border-right: thin">
                                <tbody>                                                                
                                    <%-- other controls --%>
                                </tbody>
                            </table>
                        </div>
                    </asp:Panel>
                </div>
            </td>
        </tr>
    </ItemTemplate>
</asp:Repeater>

这是我选择的索引更改的代码:

protected void ddlFilterType_SelectedIndexChanged(object sender, EventArgs e)

    try
    
        DropDownList ddl = (DropDownList)sender;

        string ddlClass = ddl.CssClass;
        string[] classes = ddlClass.Split(' ');
        string repeaterClass = classes[classes.Length - 1];
        string repeaterID = "0";

        string appendStr = "";

        if (repeaterClass.Contains("templateID"))
        
            repeaterID = repeaterClass.Substring(repeaterClass.Length - 1);
            appendStr = "_" + repeaterID;
                    

        foreach (RepeaterItem item in billingTemplate.Items)
        
            htmlInputHidden hidden = item.FindControl("headingBilling").FindControl("templateUK") as HtmlInputHidden;

            if (hidden.Value == repeaterID)
            
                DropDownList d1 = item.FindControl("headingBilling").FindControl("ddlInvFilterType") as DropDownList;
                DropDownList d2 = item.FindControl("headingBilling").FindControl("ddlInvFilterValue") as DropDownList;

            if (d1.SelectedValue.Length > 0)
            
                d2.Items.Clear();
                d2.Items.Add(new ListItem(" - None - ", ""));
                    switch (d1.SelectedValue)
                    
                        case "ServiceTeams":
                            foreach (var pair in serviceTeamsController.GetAllServiceTeamsLOVs())
                            
                                if (!String.IsNullOrWhiteSpace(pair.Value))
                                    d2.Items.Add(new ListItem(pair.Value, pair.Key));
                            
                            break;
                        default:
                            foreach (var pair in masterController.GetMasterLOVs(filterTypeDict[d1.SelectedValue]))
                            
                                if (!String.IsNullOrWhiteSpace(pair.Value))
                                
                                    d2.Items.Add(new ListItem(pair.Value, pair.Key));
                                
                            
                            break;                                
                        
                    
                    else
                    
                        d2.Items.Clear();
                        d2.Items.Add(new ListItem(" - None - ", ""));
                                       
                            
        
    
    catch (Exception ex)
    

    

这是我在有多个中继器项目时看到的屏幕截图:

基本上现在发生的情况是,如果我更新 item2 中的过滤器类型,它将更新 item1 中的过滤器值。如果我更新 item1 中的过滤器类型,它将按预期更新 item 1 中的过滤器值。

我想要的是能够更新 item2 过滤器类型,然后相应地更新 item2 中的过滤器值。

有人对我可能遗漏的内容有任何想法吗?

【问题讨论】:

是您正在编写的新代码还是您正在尝试增强的现有代码? @EricWalter 我正在编写的新代码 【参考方案1】:

所以最终让它工作,我认为主要问题是 clientidmode 以某种方式混淆了更新面板,所以我删除了它并让更新面板绕过两个下拉菜单。我也最终不需要触发器,所以我也删除了它。

【讨论】:

以上是关于在中继器中获取正确的控制/更新面板的问题的主要内容,如果未能解决你的问题,请参考以下文章

更新面板中 Asp 中继器的页面回发问题

更新面板中的链接按钮导致页面刷新

转发器会导致整个页面的回发,即使它位于更新面板内

有没有办法异步过滤 IList?

从放置在更新面板外部的控件触发 asp.net 事件

在中继器UpdatePanel问题内单击按钮