C# 错误';对象引用未设置为对象的实例';在grid.FindControl期间

C# 错误';对象引用未设置为对象的实例';在grid.FindControl期间,c#,asp.net,C#,Asp.net,有人知道我的代码哪里出错了吗?我在.cs文件下编写了以下代码以获取网格计数: int totalCount = grid.FindControl("employee_to_rep").Controls.Count; for (int i = 0; i < totalCount; i++) { CheckBox ck = (CheckBox)grid.FindControl("employee_to_rep").Controls[i];

有人知道我的代码哪里出错了吗?我在.cs文件下编写了以下代码以获取网格计数:

    int totalCount = grid.FindControl("employee_to_rep").Controls.Count;
    for (int i = 0; i < totalCount; i++)
    {
        CheckBox ck = (CheckBox)grid.FindControl("employee_to_rep").Controls[i];
        HiddenField employeeIDValue = (HiddenField)grid.FindControl("employeeidToRep").Controls[i];
        if (ck.Checked)
        {
            test = employeeIDValue.Value.ToString();
        }
    }
有人知道那里发生了什么吗

aspx文件中的代码:

    <tr>   
        <th class="graytext r">Add Reps to Team:</th>
        <td>               
         <asp:GridView ID="grid" runat="server" AutoGenerateColumns="False" DataKeyNames="EmployeeID"
                DataSourceID="dsEmployees" AllowPaging="true" PageSize="1000" EnableViewState="false"
                GridLines="None" CssClass="clGridDirectory">
                <Columns>
                  <asp:TemplateField >
                    <ItemTemplate>
                      <asp:CheckBox runat="server" ID='employee_to_rep' Text='<%# Eval("fullname") %>'/> 
                      <asp:HiddenField runat="server" ID="employeeidToRep" Value='<%# Eval("employeeid") %>'/>
                      <asp:TextBox runat='server' ID='repID' Text='<%# Eval("rep_id") %>'/>
                    </ItemTemplate>
                  </asp:TemplateField>
                </Columns>
              </asp:GridView>       
           <asp:SqlDataSource ID="dsEmployees" runat="server" ConnectionString="<%$ ConnectionStrings:TestConnectionString %>"
                SelectCommand="app_staff_without_team_select" SelectCommandType="StoredProcedure">
          </asp:SqlDataSource>          
        </td>
    </tr>  

向团队中添加代表:

在访问结果之前,您可以尝试检查FindControl的结果:

if (grid.FindControl("employee_to_rep") != null)
理想情况下,您可以使用as运算符进行强制转换,然后在下一步中检查null

[编辑] 根据其他答案……如果您在gridview行中进行迭代,则需要跳过页眉和页脚ROE,只签入数据行:

foreach (GridViewRow gvr in  GridView1.Rows)
{
    if (gvr.RowType == DataControlRowType.DataRow)
    {
        // do your thing
    }
}

在访问结果之前,您可以尝试检查FindControl的结果:

if (grid.FindControl("employee_to_rep") != null)
理想情况下,您可以使用as运算符进行强制转换,然后在下一步中检查null

[编辑] 根据其他答案……如果您在gridview行中进行迭代,则需要跳过页眉和页脚ROE,只签入数据行:

foreach (GridViewRow gvr in  GridView1.Rows)
{
    if (gvr.RowType == DataControlRowType.DataRow)
    {
        // do your thing
    }
}

我想您必须在
GridViewRow
上调用FindControl

grid.Row[0].FindControl("employee_to_rep")
foreach (GridViewRow gvr in grid.Rows)
{
    CheckBox ck = (CheckBox)gvr.FindControl("employee_to_rep");
    HiddenField employeeIDValue = (HiddenField)gvr.FindControl("employeeidToRep");
    if (ck.Checked)
    {
        test = employeeIDValue.Value.ToString();
    }
}
第一排

grid.Row[grid.SelectedIndex].FindControl("employee_to_rep")

对于当前选择的行(如果选择了一行)

我认为您必须在
GridViewRow
上调用FindControl

grid.Row[0].FindControl("employee_to_rep")
foreach (GridViewRow gvr in grid.Rows)
{
    CheckBox ck = (CheckBox)gvr.FindControl("employee_to_rep");
    HiddenField employeeIDValue = (HiddenField)gvr.FindControl("employeeidToRep");
    if (ck.Checked)
    {
        test = employeeIDValue.Value.ToString();
    }
}
第一排

grid.Row[grid.SelectedIndex].FindControl("employee_to_rep")

对于当前选定的行(如果选定了一行)

我实际上没有使用ASP,但我猜:

msdn上的文档说明:

此方法将仅查找控件 如果控件是直接包含的 用指定的容器;就是, 该方法不会在整个过程中进行搜索 内部控件的层次结构 控制

可能是将
employee\u to_rep
控件包含在
asp:TemplateField
ItemTemplate
(或
asp:GridView
本身中的另一个容器)中会阻止
FindControl
方法按预期工作

然而,文件最后说

有关如何查找 当你不知道它的时候控制它 直接容器,请参阅


我并不真正使用ASP,但我猜:

msdn上的文档说明:

此方法将仅查找控件 如果控件是直接包含的 用指定的容器;就是, 该方法不会在整个过程中进行搜索 内部控件的层次结构 控制

可能是将
employee\u to_rep
控件包含在
asp:TemplateField
ItemTemplate
(或
asp:GridView
本身中的另一个容器)中会阻止
FindControl
方法按预期工作

然而,文件最后说

有关如何查找 当你不知道它的时候控制它 直接容器,请参阅


在我看来,下面这行代码正在搜索控件中的任何控件

int totalCount = grid.FindControl("employee_to_rep").Controls.Count;
您可能需要将上面的行稍微分开,以检查哪一部分是导致空引用的原因。 尝试:

我怀疑上面的方法会起作用,但是它在所定位的控件内找不到任何控件

int totalCount = grid.FindControl("employee_to_rep").Controls.Count;
您可能会使用递归方法来解决您的问题。 看看这个:


希望这能有所帮助。

在我看来,下面这行代码正在搜索控件中的任何控件

int totalCount = grid.FindControl("employee_to_rep").Controls.Count;
您可能需要将上面的行稍微分开,以检查哪一部分是导致空引用的原因。 尝试:

我怀疑上面的方法会起作用,但是它在所定位的控件内找不到任何控件

int totalCount = grid.FindControl("employee_to_rep").Controls.Count;
您可能会使用递归方法来解决您的问题。 看看这个:


希望这对您有所帮助。

您可以使用
GridViewRow
进行操作

grid.Row[0].FindControl("employee_to_rep")
foreach (GridViewRow gvr in grid.Rows)
{
    CheckBox ck = (CheckBox)gvr.FindControl("employee_to_rep");
    HiddenField employeeIDValue = (HiddenField)gvr.FindControl("employeeidToRep");
    if (ck.Checked)
    {
        test = employeeIDValue.Value.ToString();
    }
}

您可以使用
GridViewRow
执行此操作

grid.Row[0].FindControl("employee_to_rep")
foreach (GridViewRow gvr in grid.Rows)
{
    CheckBox ck = (CheckBox)gvr.FindControl("employee_to_rep");
    HiddenField employeeIDValue = (HiddenField)gvr.FindControl("employeeidToRep");
    if (ck.Checked)
    {
        test = employeeIDValue.Value.ToString();
    }
}

但这里的问题是找到了14条记录,grid.FindControl(“employee_to_rep”)不应该被删除null@Jin应该是什么并不重要,重要的是应该是什么。如果FindControl返回null,将导致您收到错误消息。我想补充一下我的原始答案……但这里的问题是找到了14条记录,而grid.FindControl(“employee_to_rep”)不应该被删除null@Jin应该是什么并不重要,重要的是应该是什么。如果FindControl返回null,将导致您收到错误消息。我要补充我原来的答案。。。