错误';对象引用未设置为对象的实例';在网格期间.FindControl
本文关键字:网格 FindControl 实例 对象引用 设置 错误 对象 | 更新日期: 2023-09-27 18:00:37
有人知道我的代码哪里出错了吗?我在.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();
}
}
但当它进入行(复选框)网格时会显示错误。FindControl("employee_to_rep").Controls[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>
我认为您必须在GridViewRow
上调用FindControl。
grid.Row[0].FindControl("employee_to_rep")
对于第一行。
grid.Row[grid.SelectedIndex].FindControl("employee_to_rep")
对于当前选择的行(如果选择了一行)
我并没有真正使用ASP,但我的猜测是:
msdn的文档指出
此方法只能找到控件如果控件直接包含由指定的容器;即,该方法不搜索整个内部控件的层次结构控制
将employee_to_rep
控件容纳在asp:TemplateField
和ItemTemplate
(或asp:GridView
本身内的另一个容器之一)内可能会阻止FindControl
方法按预期工作。
然而,文件最后说
有关如何查找控制当你不知道它立即容器,请参阅如何:通过ID访问服务器控制。
在我看来,下面的代码行正在搜索控件内的任何控件。
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
希望这能有所帮助。
您可以使用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();
}
}
在访问结果之前,您可以尝试检查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
}
}