【问题标题】:How to hide a column inside a repeater when checkbox is checked?选中复选框时如何隐藏转发器内的列?
【发布时间】:2014-08-23 09:26:02
【问题描述】:

我要做的是访问另一个中继器 (locationRepeater) 内的中继器 (areaRepeater) 内的列(标题标题为“添加到购物清单”)。如果选中复选框,我想隐藏它。然而,不管事情是如何设置的,该列永远不会隐藏。我不确定我在这里遗漏了什么……或者我的方法不对?

这是我试图用来隐藏 areaRepeater 表中的列的一段代码。我可以成功隐藏 submitBtn 按钮,但该按钮不在中继器内。

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

【问题讨论】:

    标签: c# asp.net checkbox repeater visibility


    【解决方案1】:

    我认为您可以从不同的角度来解决这个问题,这可以使您的代码更简单。

    首先尽量不要使用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 事件允许您在数据绑定发生时注入任何类型的逻辑。

    【讨论】:

    • 好的,谢谢!我会尽快尝试一下。
    • 好吧,我试过了,但它对我不起作用。我拥有您的示例中显示的所有内容,但我将“SomeField”替换为“Shopping Disabled”,这是 Sitecore 中确定该列是否隐藏的字段......
    猜你喜欢
    • 2020-06-06
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2013-08-10
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多