【问题标题】:How to delete row in gridview using rowdeleting event?如何使用 rowdeleting 事件删除 gridview 中的行?
【发布时间】:2011-08-29 05:48:54
【问题描述】:

这是我的.cs 代码:

protected void Gridview1_RowDeleting(object sender, GridViewDeleteEventArgs e)
{
 Gridview1.DeleteRow(e.RowIndex);
 Gridview1.DataBind();
}

这是markup

<asp:gridview ID="Gridview1" runat="server" ShowFooter="true" 
                                                AutoGenerateColumns="false" OnRowDeleting="Gridview1_RowDeleting">
                    <Columns>
                    <asp:BoundField DataField="RowNumber" HeaderText="Row Number" />
                    <asp:TemplateField HeaderText="Column Name">
                        <ItemTemplate>
                            <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>

                 <%-- <asp:TemplateField HeaderText="Header 2">
                        <ItemTemplate>
                            <asp:TextBox ID="TextBox2" runat="server"></asp:TextBox>
                        </ItemTemplate>
                    </asp:TemplateField>--%>
                    <asp:TemplateField HeaderText="Data Type">
                        <ItemTemplate>
                              <asp:DropDownList ID="ddldatatype" runat="server">
                              <asp:ListItem>varchar</asp:ListItem>
                              <asp:ListItem>int</asp:ListItem>
                              <asp:ListItem>numeric</asp:ListItem>
                              <asp:ListItem>uniqueidentifier</asp:ListItem>
                              <asp:ListItem>char</asp:ListItem>
                              </asp:DropDownList>
                        </ItemTemplate>
                        <FooterStyle HorizontalAlign="Right" />
                        <FooterTemplate>
                        <asp:Button ID="ButtonAdd" runat="server" Text="Add New Row" OnClick="ButtonAdd_Click"/>
                         <asp:Button ID="ButtonDel" runat="server" Text="Delete Row" OnClick="ButtonDel_Click" />
                         <input type="hidden" runat="server" value="0" id="hiddencount" />
                        </FooterTemplate>
                    </asp:TemplateField>
                    <asp:TemplateField>
                        <ItemTemplate>
                            <asp:LinkButton ID="lnkdelete" runat="server" CommandName="Delete" >Delete</asp:LinkButton>
                        </ItemTemplate>
                    </asp:TemplateField>
                    </Columns>
            </asp:gridview>

请给我建议。我做了这么多..但仍然没有删除行...

 protected void Gridview1_RowDeleting(object sender, GridViewDeleteEventArgs e)
         {


             //Gridview1.DeleteRow((int)Gridview1.DataKeys[e.RowIndex].Value);
             //Gridview1.DeleteRow(e.RowIndex);
             //Gridview1.DataBind();
             foreach(DataRow dr in dt.Rows)
             {
                 dt.Rows.Remove(dr);
                 dt.Rows[e.RowIndex].Delete();

             }
             Gridview1.DeleteRow(e.RowIndex);
            // dt = (DataTable)Gridview1.DataSource;
             Gridview1.DataSource = dt;
             Gridview1.DataBind();
       }

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:
    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];
        SqlCommand cmd = new SqlCommand("Delete From userTable (userName,age,birthPLace)");
        GridView1.DataBind();
    }
    

    【讨论】:

    • 当然(夏尔利)这是使用静态数据表的更好选择吗?虽然不确定硬编码的 SQL 命令。
    • @Rexxo 实际上这个硬编码的 SQL 命令会删除表中的所有记录,因为没有 Where 语句。
    • Crikey,很好发现!
    【解决方案2】:

    确保创建静态 DataTable 对象,然后使用以下代码:

    protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
    {
        dt.Rows.RemoveAt(e.RowIndex); 
        GridView1.DataSource = dt;
        GridView1.DataBind();
    }
    

    【讨论】:

      【解决方案3】:

      您的删除代码如下所示

      Gridview1.DeleteRow(e.RowIndex);
      Gridview1.DataBind();
      

      当您调用 Gridview1.DataBind() 时,您将使用当前数据源填充您的 gridview。因此,它将删除所有存在的行,并添加来自 CustomersSqlDataSource 的所有行。

      你需要做的是从CustomersSqlDataSource查询的表中删除行。

      您可以很容易地做到这一点,只需为CustomersSqlDataSource设置一个删除命令,添加一个删除参数,然后执行删除命令。

      CustomersSqlDataSource.DeleteCommand = "DELETE FROM Customer Where CustomerID=@CustomerID"; // Customer is the name of the table where you take your data from. Maybe you named it different 
      CustomersSqlDataSource.DeleteParameters.Add("CustomerID", Gridview1.DataKeys[e.RowIndex].Values["CustomerID"].ToString());
      CustomersSqlDataSource.Delete();
      Gridview1.DataBind();
      

      但请注意,这会从数据库中删除数据。

      【讨论】:

      • OP 声明他没有使用 SqlDataSource,所以这个答案(虽然本身是正确的)不适用于手头的问题。
      • 啊,抱歉,我正在查看 Abdul Rahman 代码,那里有一个 SQL 数据源。那么user913947,您将项目列表保存在哪里?能分享一下ButtonAdd_Click函数的实现吗??
      • 我在 ButtonAdd_Click 上动态添加文本框...我想删除文本框
      【解决方案4】:

      最简单的方法是在 ASP 中使用一些数据源创建 GridView,并在 Row_Deletinng 事件中调用该数据源。例如,如果您将 SqlDataSource1 作为您的 GridView 数据源,您的 Row_Deleting 事件将是:

      protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
      {
            int ID = int.Parse(GridView1.Rows[e.RowIndex].FindControl("ID").toString());
            string delete_command = "DELETE FROM your_table WHERE ID = " + ID;
            SqlDataSource1.DeleteCommand = delete_command;
      }
      

      【讨论】:

      • 否决使用 sql 注入容易连接的 sql 语句。使用参数化查询、存储过程或 ORM db 解决方案。
      【解决方案5】:

      查看以下代码并进行一些更改以获得您问题的答案

      <%@ Page Language="C#" %>
      
      <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
          "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
      
      <script runat="server">
      
          void CustomersGridView_RowDeleting
              (Object sender, GridViewDeleteEventArgs e)
          {
              TableCell cell = CustomersGridView.Rows[e.RowIndex].Cells[2];
              if (cell.Text == "Beaver")
              {
                  e.Cancel = true;
                  Message.Text = "You cannot delete customer Beaver.";
              }
              else
              {
                  Message.Text = "";
              }
          }  
      
      </script>
      
      <html xmlns="http://www.w3.org/1999/xhtml">
      <head id="Head1" runat="server">
          <title>GridView RowDeleting Example</title>
      </head>
      <body>
          <form id="form1" runat="server">
          <h3>
              GridView RowDeleting Example
          </h3>
          <asp:Label ID="Message" ForeColor="Red" runat="server" />
          <br />
          <asp:GridView ID="CustomersGridView" runat="server" 
              DataSourceID="CustomersSqlDataSource" 
              AutoGenerateColumns="False"
              AutoGenerateDeleteButton="True" 
              OnRowDeleting="CustomersGridView_RowDeleting"
              DataKeyNames="CustomerID,AddressID">
              <Columns>
                  <asp:BoundField DataField="FirstName" 
                      HeaderText="FirstName" SortExpression="FirstName" />
                  <asp:BoundField DataField="LastName" HeaderText="LastName" 
                      SortExpression="LastName" />
                  <asp:BoundField DataField="City" HeaderText="City" 
                      SortExpression="City" />
                  <asp:BoundField DataField="StateProvince" HeaderText="State" 
                      SortExpression="StateProvince" />
              </Columns>
          </asp:GridView>
          <asp:SqlDataSource ID="CustomersSqlDataSource" runat="server"
              SelectCommand="SELECT SalesLT.CustomerAddress.CustomerID, 
                  SalesLT.CustomerAddress.AddressID, 
                  SalesLT.Customer.FirstName, 
                  SalesLT.Customer.LastName, 
                  SalesLT.Address.City, 
                  SalesLT.Address.StateProvince 
                  FROM SalesLT.Customer 
                  INNER JOIN SalesLT.CustomerAddress 
                  ON SalesLT.Customer.CustomerID = 
                      SalesLT.CustomerAddress.CustomerID 
                  INNER JOIN SalesLT.Address ON SalesLT.CustomerAddress.AddressID = 
                      SalesLT.Address.AddressID"
              DeleteCommand="Delete from SalesLT.CustomerAddress where CustomerID = 
                  @CustomerID and AddressID = @AddressID" 
              ConnectionString="<%$ ConnectionStrings:AdventureWorksLTConnectionString %>">
              <DeleteParameters>
                  <asp:Parameter Name="AddressID" />
                  <asp:Parameter Name="CustomerID" />
              </DeleteParameters>
          </asp:SqlDataSource>
          </form>
      </body>
      </html>
      

      【讨论】:

      • @user913947 - 事件处理程序中的进程将是相同的;您只需更改绑定到的任何数据源,然后重新绑定。
      • @user913947 - 请参阅我的答案以了解我的意思。
      • 您只是从 MSDN 网站复制并粘贴了这段代码,完全没有任何解释。似曾相识? msdn.microsoft.com/en-us/library/…
      【解决方案6】:

      在 Grid 中,使用具有 ID 作为主要元素的代码来唯一标识每一行

      <asp:TemplateField>
                  <ItemTemplate>
                  <asp:HiddenField ID="Hf_ID" runat="server" Value='<%# Eval("ID") %>' />
                  </ItemTemplate>
      </asp:TemplateField>
      

      要搜索唯一 ID,请使用 C# 代码后面的代码(基本上这是搜索隐藏字段并将其存储在 var 中)

      protected void Grd_Registration_RowDeleting(object sender, GridViewDeleteEventArgs e)
          {
              var ID = (HiddenField)Grd_Registration.Rows[e.RowIndex].FindControl("ID");
              //Your Delete Logic Goes here having ID to delete
      
              GridBind();
      
          }
      

      【讨论】:

      • var id = ((HiddenField)gvImages.Rows[e.RowIndex].FindControl("ID")).Value;
      【解决方案7】:

      解决方案有点简单;一旦您从数据网格中删除了该行(您的代码仅从网格中删除该行而不是数据源),那么您不需要做任何其他事情。 当您在不更新数据源的情况下立即执行数据绑定操作时,您正在将源中的所有行重新添加到 gridview 控件(包括在上一条语句中从网格中删除的行)。

      要在没有数据源的情况下简单地从网格中删除,然后只需在网格上调用删除操作,这就是您需要做的一切......之后不需要数据绑定。

      【讨论】:

        【解决方案8】:

        在页面加载中添加以下行,

        ViewState["GetRecords"] = dt;
        

        然后试试这个,

        protected void DeleteRows(object sender, GridViewDeleteEventArgs e)
        {
           dt = ViewState["GetRecords"] as DataTable;
           dt.Rows.RemoveAt(e.RowIndex);
            dt.AcceptChanges();
            ViewState["GetRecords"] = dt;
            BindData();
        }
        

        如果仍有问题,请在 BindData() 方法中发送代码

        【讨论】:

          【解决方案9】:

          试试这个确保你提到Datakeyname,它只是你设计器文件中的列名(id)

          //你的aspx代码

          asp:GridView ID="dgUsers" runat="server" AutoGenerateSelectButton="True" OnDataBound="dgUsers_DataBound" OnRowDataBound="dgUsers_RowDataBound" OnSelectedIndexChanged="dgUsers_SelectedIndexChanged" AutoGenerateDeleteButton="True" OnRowDeleting="dgUsers_RowDeleting" DataKeyNames="id" OnRowCommand="dgUsers_RowCommand"></asp:GridView>

          //你的aspx.cs代码

          protected void dgUsers_RowDeleting(object sender, GridViewDeleteEventArgs e)
                  {
          
                      int id = Convert.ToInt32(dgUsers.DataKeys[e.RowIndex].Value);
                      string query = "delete from users where id= '" + id + "'";
                      //your remaining delete code
                  }
          

          【讨论】:

            【解决方案10】:

            我认为您犯了与此链接中提到的重新绑定相同的错误

            How to delete row from gridview?

            【讨论】:

            • 我有linkbutton..有没有从gridview删除rwo的代码..我在没有sqldatasource的情况下这样做..你发给我的链接,我读了,但没有满意代码对我来说..
            【解决方案11】:

            如果我记得您之前的问题,您将绑定到 DataTable。试试这个:

            protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
            {
            
                DataTable sourceData = (DataTable)GridView1.DataSource;
            
                sourceData.Rows[e.RowIndex].Delete();
            
                GridVie1.DataSource = sourceData;
                GridView1.DataBind();
            }
            

            基本上,正如我在评论中所说,获取 GridView 的 DataSource 的副本,从中删除行,然后将 DataSource 设置为更新的对象并再次对其调用 DataBind()。

            【讨论】:

            • 对象引用未设置为对象的实例。
            • 检查 e.RowIndex 是否有值。
            • 请任何人告诉我如何在不使用 sqldatasource 的情况下从 gridiview 中删除行
            • 在代码的 RowDeleting 方法中设置断点。在调试模式下运行程序(按F5),删除一行,然后您可以检查e.RowIndex的值。
            【解决方案12】:

            这是您想要实现的目标的技巧。我也遇到了像你这样的问题。

            在 RowDeleting 事件中获取选定的行和数据键很难但是在 SelectedIndexChanged 事件中获取选定的行和数据键非常容易。这是一个例子-

            protected void gv_SelectedIndexChanged(object sender, EventArgs e)
            {
                    int index = gv.SelectedIndex;
                    int vehicleId = Convert.ToInt32(gv.DataKeys[index].Value);
                    SqlConnection con = new SqlConnection("-----");
                    SqlCommand com = new SqlCommand("DELETE FROM tbl WHERE vId = @vId", con);
                    com.Parameters.AddWithValue("@vId", vehicleId);
                    con.Open();
                    com.ExecuteNonQuery();
            }
            

            【讨论】:

            • 我不建议将数据访问代码放在演示代码后面的代码中。
            【解决方案13】:
                 protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
                {
                    int index = GridView1.SelectedIndex;
                    int id = Convert.ToInt32(GridView1.DataKeys[index].Value);
                    SqlConnection con = new SqlConnection(str);
                    SqlCommand com = new SqlCommand("spDelete", con);
                    com.Parameters.AddWithValue("@PatientId", id);
                    con.Open();
                    com.ExecuteNonQuery();
            

            索引超出范围。必须是非负数且小于集合的大小。 参数名称:索引

            【讨论】:

              【解决方案14】:

              我知道这是一个迟到的答案,但它仍然可以帮助需要解决方案的人。 我建议使用 OnRowCommand 和 DataKeyNames 进行删除操作,保留 OnRowDeleting 函数以避免异常。

              <asp:gridview ID="Gridview1" runat="server" ShowFooter="true" 
                   AutoGenerateColumns="false" OnRowDeleting="Gridview1_RowDeleting" OnRowCommand="Gridview1_RowCommand" DataKeyNames="ID">
              

              在 gridView 中包含 DataKeyNames="ID" 并在链接按钮中指定。

              <asp:LinkButton ID="lnkdelete" runat="server" CommandName="Delete" CommandArgument='<%#Eval("ID")%>'>Delete</asp:LinkButton>
              
              protected void Gridview1_RowCommand(object sender, GridViewCommandEventArgs e)
              {
                if (e.CommandName == "Delete")
                  {
                    int ID = Convert.ToInt32(e.CommandArgument);
                    //now perform the delete operation using ID value
                  }
              }
              
              protected void Gridview1_RowDeleting(object sender, GridViewDeleteEventArgs e)    
              {
              //Leave it blank
              }
              

              如果有帮助,请给我+

              【讨论】:

                【解决方案15】:
                protected void GridView1_RowDeleting(object sender, GridViewDeleteEventArgs e)
                {
                    MySqlCommand cmd;
                    string id1 = GridView1.DataKeys[e.RowIndex].Value.ToString();
                    con.Open();
                    cmd = new MySqlCommand("delete from tableName where refno='" + id1 + "'", con);
                    cmd.ExecuteNonQuery();
                    con.Close();
                    BindView();
                }
                private void BindView()
                {
                    GridView1.DataSource = ms.dTable("select * from table_name");
                    GridView1.DataBind();
                }
                

                【讨论】:

                  【解决方案16】:
                  //message box before deletion
                  protected void grdEmployee_RowDataBound(object sender, GridViewRowEventArgs e)
                  {
                      if (e.Row.RowType == DataControlRowType.DataRow)
                      {
                          foreach (DataControlFieldCell cell in e.Row.Cells)
                          {
                              foreach (Control control in cell.Controls)
                              {
                                  LinkButton button = control as LinkButton;
                                  if (button != null && button.CommandName == "Delete")
                                      button.OnClientClick = "if (!confirm('Are you sure " +
                                             "you want to delete this record?')) return false;";
                              }
                          }
                      }
                  }
                  
                  //deletion
                  protected void grdEmployee_RowDeleting(object sender, GridViewDeleteEventArgs e)
                  {
                      conn.Open();
                      int empid = Convert.ToInt32(((Label)grdEmployee.Rows[e.RowIndex].Cells[0].FindControl("lblIdBind")).Text);
                      SqlCommand cmdDelete = new SqlCommand("Delete from employee_details where id=" + empid, conn);
                      cmdDelete.ExecuteNonQuery();
                      conn.Close();
                      grdEmployee_refreshdata();
                  
                  }
                  

                  【讨论】:

                  • 请添加代码背后的逻辑描述
                  猜你喜欢
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2018-05-11
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多