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

时间:2011-06-28 04:17:13

标签: 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];
        HiddenField employeeIDValue = (HiddenField)grid.FindControl("employeeidToRep").Controls[i];
        if (ck.Checked)
        {
            test = employeeIDValue.Value.ToString();
        }
    }

但是当它出现在行(CheckBox)grid.FindControl(“employee_to_rep”)时出现错误。控件[i];

Object reference not set to an instance of an object. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.NullReferenceException: Object reference not set to an instance of an object.

Source Error: 

Line 80: 
Line 81:             int totalCount = grid.FindControl("employee_to_rep").Controls.Count;

有谁知道那里发生了什么?

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>  

5 个答案:

答案 0 :(得分:2)

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

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

第一行。

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

表示当前选定的行(如果选择了行)

答案 1 :(得分:1)

您可以尝试检查FindControl 的结果,以便访问结果:

if (grid.FindControl("employee_to_rep") != null)

理想情况下,您可以使用 as 运算符进行强制转换,然后在下一步中检查null。

[编辑] 基于其他答案...如果您正在遍历gridview行,则需要跳过页眉和页脚roes并仅检入数据行:

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

答案 2 :(得分:1)

我没有真正使用ASP,但这是我的猜测:

msdn上的文档说明了

  

此方法仅查找控件   如果控件是直接包含的   由指定的容器;那是,   该方法不会全程搜索   内部控件的层次结构   对照

employee_to_rep控件置于asp:TemplateFieldItemTemplate(或asp:GridView内的其他容器之一)中可能会阻止FindControl控制1}}方法按预期工作。

然而,文件说完了

  

有关如何查找的信息   当你不知道它时控制   直接容器,请参阅How to: Access Server Controls by ID

答案 3 :(得分:1)

在我看来,以下代码行正在搜索控件内的任何控件。

int totalCount = grid.FindControl("employee_to_rep").Controls.Count;

您可能需要稍微拆分上面的行以检查哪个部分是空引用的原因。 试试:

var control = (CheckBox) grid.FindControl("employee_to_rep");

我怀疑上面的内容是可行的,但它找不到位于控件内部的任何控件。

您可以使用递归方法来解决您的问题。 看看这个:http://msmvps.com/blogs/deborahk/archive/2009/07/27/finding-controls-on-forms.aspx

希望这有帮助。

答案 4 :(得分:1)

您可以使用GridViewRow

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();
    }
}