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
相关产品推荐
相关产品推荐

