【问题标题】:ASP.NET CheckBox Control showing as a Literial显示为文字的 ASP.NET CheckBox 控件
【发布时间】:2014-10-13 08:12:09
【问题描述】:

我有一个包含 CheckBox 控件的嵌套中继器。

<asp:Repeater runat="server" ID="optionalRepeater" OnItemDataBound="CheckCompCondiments">
    <HeaderTemplate>
        <div class="sectionHeader" style="font-weight: bold; font-size: 13pt; text-decoration: underline; margin: 20px 0px 15px 0px;">
            Product Extras
        </div>
    </HeaderTemplate>
    <ItemTemplate>

        <div class="col-md-4" style="border: 1px solid #ccc; margin: 5px;">

            <asp:HiddenField runat="server" ID="salesMenuID" Value='<%#Eval("sales_menu_id") %>' />
            <asp:HiddenField runat="server" ID="minVal" Value='<%#Eval("minVal") %>' />
            <asp:HiddenField runat="server" ID="maxVal" Value='<%#Eval("maxVal") %>' />
            <p>
                <asp:Label runat="server" ID="condHdr" style="text-decoration: underline;" Text='<%#Eval("sales_menu_desc") %>'></asp:Label>
            </p>

            <asp:Repeater runat="server" ID="compMenuRadio">
                <HeaderTemplate>

                </HeaderTemplate>

                <ItemTemplate>
                    <asp:HiddenField runat="server" ID="hdPriLvl"/>
                    <input type="radio" name="compSelect" runat="server"/>
                </ItemTemplate>
                <FooterTemplate>
                    <hr/>
                </FooterTemplate>
            </asp:Repeater>

            <asp:Repeater runat="server" ID="compMenuCheck">
                <HeaderTemplate></HeaderTemplate>
                <ItemTemplate>

                    <asp:HiddenField runat="server" ID="hdPriLvl" Value='<%#Eval("pPriceLvl") %>' />
                    <asp:CheckBox runat="server" ID='compSelected' CssClass='<%# Eval("pcode") %>' Text='<%# Eval("pdesc") %> '/>
                    <%--<input type="checkbox" id="compSelect" runat="server" value='<%#Eval("pCode") %>'/>--%>
                    <%--  <%#Eval("pDesc") %>--%>

                </ItemTemplate>
                <FooterTemplate>

                </FooterTemplate>
            </asp:Repeater>

            <asp:DropDownList runat="server" ID="compSelect" Visible="False" style="width: 98%; margin: 5px 0px 5px 0px;"/>
        </div>

    </ItemTemplate>
</asp:Repeater>

在我的服务器端,我有以下代码:

if (optionalRepeater.Items.Count > 0)
{
    foreach (RepeaterItem compItem in optionalRepeater.Items)
    {
        HtmlInputHidden priLvlVal = (HtmlInputHidden)compItem.FindControl("hdPriLvl");

        foreach (Control compCtrl in compItem.Controls)
        {
            if (compCtrl.GetType() == typeof(CheckBox))
            {
                CheckBox checkBox = (CheckBox)compCtrl;
                CheckBox chk = (CheckBox) checkBox;


                if (checkBox.Checked)
                {
                    string prod = checkBox.CssClass;
                    string childGuiud = Guid.NewGuid().ToString("N").ToUpper();
                    hasCondiment = true;
                    ShoppingCart.Instance.AddItem(prod, childGuiud, mainGuid, Session["transactionGuid"].ToString(), priLvlVal.Value, hasCondiment, 1, null);
                    checkBox.Checked = false;
                }
            }


        }
    }
}

我的代码到此为止

if (compCtrl.GetType() == typeof(CheckBox))

但永远不要在 if 语句中使用它。当我期望类型为 CheckBox 时,它会显示文字 Control。

任何人都可以看到我做错了什么吗?我已经研究了一段时间了,我似乎无法进一步了解。

谢谢, 索曼哥!

【问题讨论】:

    标签: c# asp.net webforms controls


    【解决方案1】:

    如果您使用ItemTemplate,则必须使用FindControl 来获取内部控件的引用:

    foreach (RepeaterItem compItem in optionalRepeater.Items)
    {
        HtmlInputHidden priLvlVal = (HtmlInputHidden)compItem.FindControl("hdPriLvl");
        CheckBox compSelect = (CheckBox)compItem.FindControl("compSelect");
        if (checkBox.Checked)
        {
            // ...
        }
    }
    

    通过循环RepeaterItem.Controls 属性,您只需找到一个Literal 控件,它是ItemTemplate 中每个控件的容器。所以你可以循环compItem.Controls[0].Controls 来找到你的CheckBox。但在我看来,使用compItem.FindControl 更具可读性。

    【讨论】:

    • 感谢您的回复时间。我尝试了您的解决方案,但由于我的下拉框具有相同的 ID,它引发了错误。我已经更新了问题以包括父中继器。我一开始就应该这样做。
    • @somango:然后首先通过FindControl 找到您的内部中继器,然后循环这些项目并通过innerItem.FindControl("compSelect") 获取CheckBox。顺便说一句,如果您需要在服务器端访问它,为什么不使用CheckBox 而不是input type="radio"
    • 我将此标记为正确答案。虽然它实际上不是我使用的,但它让我走上了正确的轨道,我现在的应用程序按预期工作,所以 Tim Schmelter 先生对你说,我说 Vielen Dank!
    猜你喜欢
    • 2019-10-27
    • 2011-10-18
    • 2011-03-27
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    相关资源
    最近更新 更多