如何在选中复选框时在中继器中隐藏列

本文关键字:中继器 隐藏 复选框 | 更新日期: 2023-09-27 18:11:13

我要做的是访问中继器(areaRepeater)内的列(标题为"添加到购物清单"),这是在另一个中继器(locationRepeater)内。如果复选框被选中,我想隐藏它。然而,无论如何设置,列都不会被隐藏。我不知道我在这里错过了什么……还是我用错了方法?

下面是我试图用来隐藏areaRepeater表中的列的一段代码。我可以成功地隐藏提交按钮,但该按钮不在中继器中。

                    Sitecore.Data.Fields.CheckboxField checkBox = ProductGroup.Fields["Shopping Disabled"];
                    if (checkBox.Checked)
                    {
                        submitBtn.Visible = false;
                        Repeater rpt1 = (Repeater)FindControl("locationRepeater");
                        Response.Write("a ");
                        foreach (RepeaterItem rep in rpt1.Items)
                        {
                            Response.Write("1 ");
                            Repeater areaRepeater = (Repeater)rep.FindControl("areaRepeater");
                            foreach (RepeaterItem areaRep in areaRepeater.Items)
                            {
                                Response.Write("2 ");
                                if (showField() == false)
                                {
                                    Label lbl1 = (Label)areaRep.FindControl("litCol");
                                    CheckBox check = (CheckBox)areaRep.FindControl("LineQuantity");
                                    lbl1.Visible = false;
                                    check.Visible = false;
                                }

                            }
                        }
                    }

这是两个中继器的设计代码。我尝试设置标题和复选框标签的可见性与一个名为showField()的函数,但它从未被调用,即使它确实返回正确的bool值:

 <asp:Repeater ID="locationRepeater" runat="server" OnItemDataBound="SetInner">   
    <ItemTemplate>
        <div class="LocationName">
             <%# Eval("SecOpen") %><%# Eval("LocationName")%> <%# Eval("SecClose") %>
        </div>
        <asp:Repeater ID="areaRepeater" runat="server">  
         <HeaderTemplate>
            <div class="headerRow">
                    <div class="header">
                        <div class="thumb"><p></p></div>
                        <div class="headerField name"><p class="hField">Product</p></div>
                        <div class="headerField sku"><p class="hField">SKU</p></div>
                        <div class="headerField size"><p class="hField">Size</p></div>
                        <div class="headerField case"><p class="hField">Case Pack</p></div>
                        <div class="headerField use"><p class="hField">Use With</p></div>
                        <div id="shoppingHeader" class="headerField qty" runat="server"><p class="headerfield qty hField"><asp:Label id="listCol" runat="server" visible='<%# showField() %>' Text="Add To Shopping List" /> </p></div>
                    </div>
             </div>
        </HeaderTemplate>      
            <ItemTemplate>
                <asp:placeholder id="LocationAreaHeader" runat="server" visible='<%# (Eval("AreaName").ToString().Length == 0  ? false : true) %>' ><h3> <%# Eval("AreaName") %></h3></asp:placeholder>
                    <asp:placeholder id="ProductTable" runat="server" visible='<%# (Eval("ProductName").ToString().Length == 0  ? false : true) %>' >
                       <div class="table">
                           <div class="row">
                               <div class="thumb"><%# Eval("Charm") %></div>
                                <div class="field name"><p class="pField"> <%# Eval("ThumbOpen") %><%# Eval("ProductName") %><%# Eval("ThumbClose") %></p> </div>
                                <div class="field sku"><p class="pField"> <%# Eval("Sku") %> </p></div>
                                <div class="field size"><p class="pField"> <%# Eval("Size") %></p></div>
                                <div class="field case"><p class="pField"> <%# Eval("CasePack") %> </p></div>
                                <div class="field use"><p class="pField"> <%# Eval("UseWith") %> </p></div>
                                <div id="shopping" class="field qty" runat="server"><p class="pField"> <asp:checkbox visible='<%# showField() %>' id="LineQuantity" runat="server" /></p></div>
                            </div>
                        </div>
                           <asp:Label id="productID" text='<%# Eval("productID") %>' visible="false" runat="server" />
                    </asp:placeholder>
               <!-- Stored values -->
               <asp:Label id="SkuID" runat="server" text='<%# Eval("SkuID") %>' visible="true" />
               <asp:Label id="masterSku" runat="server" text='<%# Eval("masterSku") %>' visible="false" />
               <asp:Label id="masterName" runat="server" text='<%# Eval("masterName" ) %>' visible="false" />
             <asp:Label ID="test" visible="false" runat="server" text='<%# Eval("AreaID") %>' />
            </ItemTemplate>
        </asp:Repeater>
        <asp:Label ID="refID" visible="false" runat="server" text='<%# Eval("LocationID") %>' />
    </ItemTemplate>
</asp:Repeater>

这是showField()函数:

protected bool showField()
{
    bool retVal = true;
    Item CurrentItem = Sitecore.Context.Item;
    Item HomeItem = ScHelper.FindAncestor(CurrentItem, "Market");
    if (HomeItem != null)
    {
        Item ProductGroup = HomeItem.Axes.SelectSingleItem(@"child::*[@@templatename='MarketOfficeBuildigProductMap']");
        if (ProductGroup != null)
        {
            Sitecore.Data.Fields.CheckboxField checkBox = ProductGroup.Fields["Shopping Disabled"];//curently returns true
            ShoppingDisabled.Value = checkBox.Checked.ToString();
            if (checkBox.Checked == true)
            {
                retVal = false;
            }
        }
    }
    return retVal;
}

如何在选中复选框时在中继器中隐藏列

我认为你可以从一个不同的角度来处理这个问题,这会使你的代码更简单。

首先尽量不要使用OnDataBound事件。我更喜欢对特定控件使用DataBinding事件,因为它可以更好地本地化代码,并且您永远不会搜索控件。我不完全确定你的代码是如何工作的,但看看我将如何实现你试图隐藏使用DataBinding事件的两个控件。

。对于Checkbox:

<asp:CheckBox id="LineQuantity" runat="server" OnDataBinding="LineQuantity_DataBinding" />
protected void LineQuantity_DataBinding(object sender, System.EventArgs e)
{
    CheckBox chk = (CheckBox)sender;
    chk.Checked = (bool)(Eval("SomeField"));  // Note you can use Eval here...
    chk.Visible = showField();
}

这至少可以帮助您定位问题。在数据绑定时,我通常使用这种方法进行任何自定义工作。DataBound事件不是很好,因为它发生在所有工作完成之后。OnDataBinding事件允许您在数据绑定发生时注入任何类型的逻辑。