You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web Forms中Repeater遍历类型转换错误及ID获取问题

解决ASP.NET Web Forms Repeater遍历的类型转换异常及行ID获取问题

1. 解决InvalidCastException异常

原代码中foreach (Repeater gvr in repPSStatus.Items)存在类型错误:Repeater.Items集合的元素是**RepeaterItem**类型,而非Repeater类型,直接强制转换会抛出类型转换异常。

修正方式:将循环变量类型改为RepeaterItem。

2. 获取选中行的ID值

当前前端仅用<%# Eval("id") %>直接输出ID,属于静态HTML内容,后端无法通过FindControl获取。需将ID存储到服务器控件中,推荐两种方案:

方案一:使用HiddenField存储ID

修改前端ItemTemplate,添加HiddenField绑定ID值:

<ItemTemplate>
<tr>
<td>
    <%# Eval("id") %>
    <asp:HiddenField ID="hdnId" runat="server" Value='<%# Eval("id") %>' />
</td>
<td class="GridCentre" style="width:20px;">
    <asp:CheckBox id="chkSel" runat="server" Checked="false"/>
</td>
</tr>
</ItemTemplate>

方案二:绑定ID到CheckBox的Value属性

直接将ID赋值给CheckBox的Value属性,无需额外控件:

<ItemTemplate>
<tr>
<td><%# Eval("id") %></td>
<td class="GridCentre" style="width:20px;">
    <asp:CheckBox id="chkSel" runat="server" Checked="false" Value='<%# Eval("id") %>' />
</td>
</tr>
</ItemTemplate>

修正后的后端代码

结合上述方案,修改后的Print_Click方法如下:

protected void Print_Click(object sender, EventArgs e)
{
    int counter = 0;
    // 遍历RepeaterItem类型的元素
    foreach (RepeaterItem item in repPSStatus.Items)
    {
        CheckBox chkSel = item.FindControl("chkSel") as CheckBox;
        // 先判断控件是否存在且被选中
        if (chkSel != null && chkSel.Checked)
        {
            string id = string.Empty;
            
            // 方案一:从HiddenField获取ID
            HiddenField hdnId = item.FindControl("hdnId") as HiddenField;
            if (hdnId != null)
            {
                id = hdnId.Value;
            }

            // 方案二:从CheckBox的Value属性获取ID(启用此方式需对应前端修改)
            // id = chkSel.Value;

            if (!string.IsNullOrEmpty(id))
            {
                string msg = busiObj.updatestatus(id);
                if (msg == "SUCCESS")
                {
                    counter++;
                }
            }
        }
    }
}

关键说明

  • 使用as运算符进行控件转换,并判断控件是否为null,避免空引用异常。
  • 存储ID的服务器控件必须设置runat="server",否则后端无法通过FindControl定位。

内容的提问来源于stack exchange,提问作者ahmed abdelaziz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:38:09