Gridview 中的行删除事件
Rowdeleteing event in Gridview
我一直在尝试编写这个简单的逻辑,从 gridview 和所选行的 SQL 数据库中删除一行,但不断得到对单元格的空引用,该单元格具有主键 [ ID] 在字段中。
这是我的 html:
<asp:GridView ID="grvInventoryEdit" runat="server" BackColor="White" onrowdeleting="grvInventoryEdit_RowDeleting"
onrowediting="grvInventoryEdit_RowEditing"
onrowupdating="grvInventoryEdit_RowUpdating">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:CommandField ShowDeleteButton="True" /><asp:TemplateField HeaderText="Id">
<ItemTemplate>
<%#Eval("No")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="txtEditNo" ReadOnly="True" Text='<%#Eval("No")%>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>........ </Columns> </asp:GridView>
我的行删除事件后端代码是:
protected void grvInventoryEdit_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
TextBox id = (TextBox)grvInventoryEdit.Rows[e.RowIndex].FindControl("txtEditNo");
Asset asset = db.Assets.Single(a => a.No == Convert.ToInt32(id));
db.Assets.DeleteOnSubmit(asset);
db.SubmitChanges();
binddata();
}
当事件触发时,这是我在调试时看到的:
我不确定为什么我得到的是空值,但是该单元格有一个值。
你能告诉我我做错了什么吗?
此致,
您传递的是 TextBox
对象,而不是 TextBox
的 Text
属性
Asset asset = db.Assets.Single(x=>x.No == Convert.ToInt32(id.Text));
并且您的 TextBox
也将变为 null,这意味着它无法在 GridView 中找到它,请这样尝试:
TextBox id = e.Row.FindControl("txtEditNo");
另见 this CodeProject article to understand how to use ItemTemplate and EditItemTemplate
可能是因为文本框只读属性,而不是用户。
如果您想使用图像按钮进行编辑和删除,请使用
protected void ibtnDelete_Click(object sender, ImageClickEventArgs e)
{
GridViewRow gvRow = (GridViewRow)((ImageButton)sender).NamingContainer;
Int32 UserId = Convert.ToInt32(gvUsers.DataKeys[gvRow.RowIndex].Value);
// delete and hide the row from grid view
if (DeleteUserByID(UserId))
gvRow.Visible = false;
}
- 为什么要添加第二个命令字段而不是仅在现有命令字段上启用删除按钮。
- 如果您使用的是命令字段,则应提供提供删除功能的兼容数据源
- 如果您要 "rolling your own" 删除功能,则只需使用常规 Button 控件并提供 CommandName 和 CommandArgument,例如
CommandName="MyDelete" CommandArgument=<row number>
其中 <row number>
是通过 GridView RowDataBound() 事件提供的。
- 无论您选择如何实施
Delete
您都应该将关键字段放在 GridView DataKeys
属性 中而不是每行中的一个字段。这将使获得 PK 比您尝试做的更容易
我想,在我的 HTML 中,我只有绑定到该项目的值,正在显示,并且在我的 <ItemTemplate>
中没有文本框,因此,它提取空值.然而,在我的 <EditItemTemplate>
中有一个文本框,它可以从单元格中提取值。
所以我将 HTML 更改为:
<asp:TemplateField HeaderText="Id">
<ItemTemplate>`<asp:label runat="server" ID="lblEditNo" ReadOnly="True" Text='<%#Eval("No")%>'></asp:label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="txtEditNo" ReadOnly="True" Text='<%#Eval("No")%>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
我的代码隐藏没有变化,这解决了问题。
我一直在尝试编写这个简单的逻辑,从 gridview 和所选行的 SQL 数据库中删除一行,但不断得到对单元格的空引用,该单元格具有主键 [ ID] 在字段中。
这是我的 html:
<asp:GridView ID="grvInventoryEdit" runat="server" BackColor="White" onrowdeleting="grvInventoryEdit_RowDeleting"
onrowediting="grvInventoryEdit_RowEditing"
onrowupdating="grvInventoryEdit_RowUpdating">
<Columns>
<asp:CommandField ShowEditButton="True" />
<asp:CommandField ShowDeleteButton="True" /><asp:TemplateField HeaderText="Id">
<ItemTemplate>
<%#Eval("No")%>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="txtEditNo" ReadOnly="True" Text='<%#Eval("No")%>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>........ </Columns> </asp:GridView>
我的行删除事件后端代码是:
protected void grvInventoryEdit_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
TextBox id = (TextBox)grvInventoryEdit.Rows[e.RowIndex].FindControl("txtEditNo");
Asset asset = db.Assets.Single(a => a.No == Convert.ToInt32(id));
db.Assets.DeleteOnSubmit(asset);
db.SubmitChanges();
binddata();
}
当事件触发时,这是我在调试时看到的:
我不确定为什么我得到的是空值,但是该单元格有一个值。
你能告诉我我做错了什么吗?
此致,
您传递的是 TextBox
对象,而不是 TextBox
Text
属性
Asset asset = db.Assets.Single(x=>x.No == Convert.ToInt32(id.Text));
并且您的 TextBox
也将变为 null,这意味着它无法在 GridView 中找到它,请这样尝试:
TextBox id = e.Row.FindControl("txtEditNo");
另见 this CodeProject article to understand how to use ItemTemplate and EditItemTemplate
可能是因为文本框只读属性,而不是用户。
如果您想使用图像按钮进行编辑和删除,请使用
protected void ibtnDelete_Click(object sender, ImageClickEventArgs e)
{
GridViewRow gvRow = (GridViewRow)((ImageButton)sender).NamingContainer;
Int32 UserId = Convert.ToInt32(gvUsers.DataKeys[gvRow.RowIndex].Value);
// delete and hide the row from grid view
if (DeleteUserByID(UserId))
gvRow.Visible = false;
}
- 为什么要添加第二个命令字段而不是仅在现有命令字段上启用删除按钮。
- 如果您使用的是命令字段,则应提供提供删除功能的兼容数据源
- 如果您要 "rolling your own" 删除功能,则只需使用常规 Button 控件并提供 CommandName 和 CommandArgument,例如
CommandName="MyDelete" CommandArgument=<row number>
其中<row number>
是通过 GridView RowDataBound() 事件提供的。 - 无论您选择如何实施
Delete
您都应该将关键字段放在 GridViewDataKeys
属性 中而不是每行中的一个字段。这将使获得 PK 比您尝试做的更容易
我想,在我的 HTML 中,我只有绑定到该项目的值,正在显示,并且在我的 <ItemTemplate>
中没有文本框,因此,它提取空值.然而,在我的 <EditItemTemplate>
中有一个文本框,它可以从单元格中提取值。
所以我将 HTML 更改为:
<asp:TemplateField HeaderText="Id">
<ItemTemplate>`<asp:label runat="server" ID="lblEditNo" ReadOnly="True" Text='<%#Eval("No")%>'></asp:label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox runat="server" ID="txtEditNo" ReadOnly="True" Text='<%#Eval("No")%>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
我的代码隐藏没有变化,这解决了问题。