我一直在尝试编写这样一个简单的逻辑,即从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>
我的rowdeleting事件的后端代码是:
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();
}
当事件触发时,这是我在调试时看到的:
我不知道为什么我得到一个空值,但是该单元格有一个值。
你能告诉我我做错了吗?
此致
答案 0 :(得分:1)
您正在传递TextBox
个对象,而不是Text
<{1}}的{{1}}属性
TextBox
并且您的Asset asset = db.Assets.Single(x=>x.No == Convert.ToInt32(id.Text));
也将为null意味着它无法在GridView中找到它,请尝试这样:
TextBox
另见this CodeProject article to understand how to use ItemTemplate and EditItemTemplate
答案 1 :(得分:1)
可能是由于textbox的readonly属性,而不是suer。
如果您想使用图像按钮进行编辑和删除,请使用
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;
}
答案 2 :(得分:1)
CommandName="MyDelete" CommandArgument=<row number>
,其中 <row number>
是通过GridView RowDataBound()事件提供的。Delete
,都应将关键字段放在GridView DataKeys
属性中,而不是每行中的字段。这将使得获取PK比你想要做的更容易答案 3 :(得分:0)
我想,在我的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>
并且我的代码隐藏没有变化,这解决了这个问题。