Gridview中的Rowdeleting事件

时间:2015-02-09 15:28:05

标签: c# asp.net 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>

我的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();
    }

当事件触发时,这是我在调试时看到的:Picture Below

我不知道为什么我得到一个空值,但是该单元格有一个值。

你能告诉我我做错了吗?

此致

4 个答案:

答案 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;
}

For complete code see

答案 2 :(得分:1)

  1. 为什么要添加第二个命令字段而不是仅在现有命令字段上启用删除按钮。
  2. 如果您使用命令字段,则应提供提供删除功能的兼容数据源
  3. 如果你“滚动自己的”删除功能,那么只需使用常规的Button控件并提供CommandName和CommandArgument,例如 CommandName="MyDelete" CommandArgument=<row number> ,其中 <row number> 是通过GridView RowDataBound()事件提供的。
  4. 无论您选择如何实施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>    

并且我的代码隐藏没有变化,这解决了这个问题。