NullReference异常:当尝试在gridview中选中复选框字段时

本文关键字:复选框 字段 gridview 异常 NullReference | 更新日期: 2023-09-27 18:26:07

我有一个带有一些复选框的网格视图。因此,在网格视图更新后,我试图查看是否选中了一个特定的复选框。然而,我得到了一个错误说

用户代码未处理空引用异常

我的代码:

<asp:TemplateField HeaderText="FollowUp" SortExpression="FollowUp">
   <EditItemTemplate>
      <asp:CheckBox ID="CheckBox1" runat="server" 
           Checked='<%# Bind("FollowUp") %>' />
   </EditItemTemplate>
   <ItemTemplate>
      <asp:CheckBox ID="chkFollowup" runat="server" 
           Checked='<%# Bind("FollowUp") %>' Enabled="false" />
   </ItemTemplate>
</asp:TemplateField>

代码隐藏文件:

protected void GViewSrvcCheck_RowUpdated(object sender, GridViewUpdatedEventArgs e)
{
    foreach (GridViewRow gRow in GViewSrvcCheck.Rows)
    {
        CheckBox fllwup = gRow.FindControl("chkFollowup") as CheckBox;
        if (fllwup.Checked)//this is the one causes the error
        { 
        }
    }
}

这里出了什么问题?我怎么能克服这个问题呢?

NullReference异常:当尝试在gridview中选中复选框字段时

有两个可能的问题:

  • 找不到控件
  • 它不是CheckBox

如果你用石膏代替,你就会知道是哪一个:

CheckBox followUp = (CheckBox) gRow.FindControl("chkFollowup");

使用as之后不检查无效性几乎总是错误的。

我怀疑问题是ID实际上也有一些东西可以识别其中的行。。。但有了以上的改变,你至少可以判断出你走的是哪条错误路径。

您可能需要更改查找控件的方式,但只要"找不到控件"是错误,我认为让它抛出异常是合理的。如果控件不存在是合法的情况,则应该显式处理它,但除此之外,向用户显示错误页面并记录异常(例如使用ELMAH)是可以的。