我有一个GridView
,其ItemTemplate
字段正在捕获已选中复选框的ID
,我有AutoPostBack=false
因此不会立即更新,我有asp:Button
我想使用C#
运行更新语句来更新数据库,其中包含所选复选框中的所有ID's
。我正在设置,但我一直收到错误
对象引用未设置为对象的实例
按下按钮时,更具体地说是抛出错误的这行代码:
string dbrowtoupdate = ((Label)row.FindControl("dataid")).Text;
这是我的网格的HTML \ C#,它的源代码是一个SQL查询,它完美填充。
<tr>
<td valign="top">
<asp:GridView runat="server" ID="gridviewtrythis" AutoGenerateColumns="false" >
<Columns>
<asp:BoundField DataField="Name" HeaderText="Full Name" />
<asp:TemplateField>
<ItemTemplate>
<asp:Label runat="server" Text='<%#Eval("dataid") %>' ID="dataid" Visible="false"></asp:Label>
</ItemTemplate>
<ItemTemplate>
<asp:CheckBox ID="cbox" runat="server" AutoPostBack="false" Checked='<%# Convert.ToBoolean(Eval("cbox")) %>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:Button runat="server" ID="btnUpdateDB" Text="Add" OnClick="btnUpdateDB_Click" />
</td>
</tr>
protected void btnUpdateDB_Click(object sender, EventArgs e)
{
try
{
foreach (GridViewRow row in gridviewtrythis.Rows)
{
string dbrowtoupdate = ((Label)row.FindControl("dataid")).Text;
if (row.RowType == DataControlRowType.DataRow)
{
}
}
}
catch (Exception exception) { throw exception; }
}
答案 0 :(得分:0)
将违规行代码更改为:
Label labelToUpdate = row.FindControl("dataid") as Label;
if (labelToUpdate)
{
string dbrowtoupdate = labelToUpdate.Text;
if (row.RowType == DataControlRowType.DataRow)
{
}
}
我愿意打赌labelToUpdate为空,因此它不会进入循环。在您正在搜索标签控件的位置放置一个断点并检查&#34; row&#34;变量,如果你想看到该行包含哪些控件,但更改为使用&#34;作为标签&#34;然后在获取.Text之前检查null是否应该保护你免受Null Reference向前移动。