在 gridview 的 DataBound 上添加控件时出现 NullReferenceExecption
NullReferenceExecption while adding controls on DataBound of a gridview
这是我的标记视图
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound" DataKeyNames="SemesterID" DataSourceID="SqlDataSource1" >
<Columns>
<asp:BoundField DataField="SemesterID" HeaderText="SemesterID" InsertVisible="False" ReadOnly="True" SortExpression="SemesterID" />
<asp:BoundField DataField="SemesterName" HeaderText="SemesterName" SortExpression="SemesterName" />
<asp:TemplateField>
<asp:PlaceHolder ID="pHldr" runat="server"></asp:PlaceHolder>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
<asp:SqlDataSource ConnectionString="<%$ connectionStrings:MyConnection %>" ID="SqlDataSource1" runat="server" ProviderName="System.Data.SqlClient" SelectCommand="SELECT SemesterID, SemesterName FROM Semesters"></asp:SqlDataSource>
</form>
</body>
这是我的代码隐藏文件
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
for (int i = 0; i < 3; i++)
{
PlaceHolder plHldr = e.Row.FindControl("pHldr") as PlaceHolder;
CheckBox cbx = new CheckBox();
plHldr.Controls.Add(cbx);//Here I get the exception
}
}
我想向 PlaceHolder 添加复选框等控件,但在 plHldr.Controls.Add(cbx);
中出现 NullReferenceException
可能是因为您没有访问第一行(行索引 -1
),即 header。尝试使用 e.Row.RowIndex
以确保您没有尝试从 header 行投射控件:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowIndex < 0) return;
for (int i = 0; i < 3; i++)
{
PlaceHolder plHldr = e.Row.FindControl("pHldr") as PlaceHolder;
CheckBox cbx = new CheckBox();
plHldr.Controls.Add(cbx);//Here I get the exception
}
}
这是我的标记视图
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" OnRowDataBound="GridView1_RowDataBound" DataKeyNames="SemesterID" DataSourceID="SqlDataSource1" >
<Columns>
<asp:BoundField DataField="SemesterID" HeaderText="SemesterID" InsertVisible="False" ReadOnly="True" SortExpression="SemesterID" />
<asp:BoundField DataField="SemesterName" HeaderText="SemesterName" SortExpression="SemesterName" />
<asp:TemplateField>
<asp:PlaceHolder ID="pHldr" runat="server"></asp:PlaceHolder>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
<asp:SqlDataSource ConnectionString="<%$ connectionStrings:MyConnection %>" ID="SqlDataSource1" runat="server" ProviderName="System.Data.SqlClient" SelectCommand="SELECT SemesterID, SemesterName FROM Semesters"></asp:SqlDataSource>
</form>
</body>
这是我的代码隐藏文件
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
for (int i = 0; i < 3; i++)
{
PlaceHolder plHldr = e.Row.FindControl("pHldr") as PlaceHolder;
CheckBox cbx = new CheckBox();
plHldr.Controls.Add(cbx);//Here I get the exception
}
}
我想向 PlaceHolder 添加复选框等控件,但在 plHldr.Controls.Add(cbx);
可能是因为您没有访问第一行(行索引 -1
),即 header。尝试使用 e.Row.RowIndex
以确保您没有尝试从 header 行投射控件:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowIndex < 0) return;
for (int i = 0; i < 3; i++)
{
PlaceHolder plHldr = e.Row.FindControl("pHldr") as PlaceHolder;
CheckBox cbx = new CheckBox();
plHldr.Controls.Add(cbx);//Here I get the exception
}
}