无法从中继器内的控件获取复选框 ID 或已检查状态

Unable to get Checkbox ID or Checked status from Control inside a Repeater

提问人:pmcs 提问时间:7/2/2020 更新时间:7/2/2020 访问量:47

问:

我正在将经典 ASP 程序转换为 C#/asp.net,由于客户要求,我没有太多的自由来更改显示的代码。

为了复制遗留代码的外观,我使用了 Repeater,如下所示:

<asp:Repeater ID="ParentRepeater" runat="server">
<HeaderTemplate><%= strHTML %></HeaderTemplate>
<ItemTemplate>
<tr>
<td class="fileRow colHeader">
<div class="chkbx">
<input type="checkbox"  id="chkbox" name='<%#Eval("strCheckBox")%>' value='<%#Eval("strCheckBox")%>' />
</div>
<div class="icn" style="background-image:  url('<%#val("strGraphic")%>');">&nbsp;</div>
<div class="flnm"><a href='<%# Eval("strLinkTo") %>' 
title='<%# Eval("strLinkTo") %>'><%# Eval("strFileName") %> </a>
<%# Eval("strAdditionalActions") %></div>
<div class="sz"><%# Eval("strSize") %></div>
<div class="typ"><%# Eval("FriendlyType") %></div>
<div class="mddt"><%# Eval("Modified") %> <%# Eval("strTimeZone") %></div>
</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>

我本来希望对控件 ID 使用一个变量,但 ID 不能在运行时填充。我使用了一个名为“chkbx”的静态 ID。这将呈现为 ParentRepeater$ct101$chkbox,转发器中每增加一个 CheckBox,101 就会递增。

我需要提取 CheckBox 名称(这是要使用的文件名)以及它是否被选中(意味着它被选中删除)。我使用了以下内容,但无法检索控制信息。2 FindControl 语句返回为 null。

遍历 Repeater 项,我确实在结果视图中看到了一些内容,但它全是 repeater 信息,没有控制信息。

                Control cb = FindControl("ParentRepeater$ct101$chkbox") as Control; // ParentRepeater$ct101$chkbox
            if (cb != null)
            {
            }


            CheckBox cbx = FindControl("ParentRepeater$ct101$chkbox") as CheckBox; // ParentRepeater$ct101$chkbox
            if (cbx != null)
            {
            }


            foreach (RepeaterItem item in ParentRepeater.Items)
            {
                if(item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
                {
                    Control btn = item.FindControl("ParentRepeater$ct101$chkbox") as Control;
                }
            }

任何帮助将不胜感激。

埃里克

复选框 中继器 FindControl

评论


答:

0赞 pmcs 7/2/2020 #1

第一个问题是我没有使用 asp.net 版本的 CheckBox。Runat=“Server” 可以更好地跟踪控件。

    <asp:Repeater ID="ParentRepeater" runat="server">
    <HeaderTemplate><%= strHTML %></HeaderTemplate>
    <ItemTemplate>
    <tr>
     <td class="fileRow colHeader">

    <div class="chkbx">                                                               <asp:CheckBox ID="chkbox" runat="server"  ToolTip='<%#Eval("strCheckBox")%>' />
</div>

<div class="icn" style="background-image: url('<%# Eval("strGraphic")%>');">&nbsp;</div>

<div class="flnm"><a href='<%# Eval("strLinkTo") %>' title='<%# Eval("strLinkTo") %>'><%# Eval("strFileName") %> </a><%# Eval("strAdditionalActions") %></div>

<div class="sz"><%# Eval("strSize") %></div>

<div class="typ"><%# Eval("FriendlyType") %></div>

<div class="mddt"><%# Eval("Modified") %> <%# Eval("strTimeZone") %></div>

</td>
</tr>
</ItemTemplate>
<FooterTemplate>
</FooterTemplate>
</asp:Repeater>

我还需要能够获取文件名。我无法使用控件 ID,因为它不会在运行时绑定。但是,工具提示将毫无问题地采用变量值。

使用下面的代码,我能够获取与每个 CheckBox 关联的文件名及其选中条件。

        foreach (RepeaterItem item in ParentRepeater.Items)
        {
            if(item.ItemType == ListItemType.Item || item.ItemType == ListItemType.AlternatingItem)
            {
                CheckBox btn = item.FindControl("chkbox") as CheckBox;
                string TEST33 = btn.ToolTip;
                bool Test34 = btn.Checked;
            }
        }