选中复选框时如何隐藏转发器内的列?

时间:2014-07-02 14:22:14

标签: c# asp.net checkbox repeater visibility

我要做的是访问位于另一个转发器(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;
}

1 个答案:

答案 0 :(得分:0)

我认为你可以从不同的角度来解决这个问题,这可能会让你的代码变得更简单。

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

e.g。对于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事件允许您在数据绑定发生时注入所需的任何逻辑类型。