如何从DataGridView中删除选定的行?

时间:2015-02-19 09:27:42

标签: c# winforms datagridview rows

我有DataGridViewButton。如果选择了行,我想通过单击按钮删除它们。我尝试了一些命令,如RemoveAtSelectedRows等,但没有任何效果。我该如何解决?

我尝试过类似的事情:

 if (dataGridView2.SelectedRows.Count > 0)
        {

                DataGridViewSelectedRowCollection rows =   dataGridView2.SelectedRows;
                dataGridView2.Rows.RemoveAt(rows);

        } 

但RemoveAt方法只接受整数。在我使用Selected Cells尝试它之前,他删除了所有行,因为总是选择一个单元格。

7 个答案:

答案 0 :(得分:11)

如果您只想从DataGridView删除所选行,请执行此操作:

foreach (DataGridViewRow row  in yourDataGridView.SelectedRows)
{
     yourDataGridView.Rows.RemoveAt(row.Index);
}

您的代码无效,因为您已使用RemoveAt(rows)RemoveAt仅接受您要删除的行的索引。您正在向其传递DataGridViewSelectedRowCollection。您可以通过DataGridViewRow.Index获取行的索引,如上所示。

答案 1 :(得分:0)

请试试这个,希望有所帮助

1. 要启用删除,请将AutoGenerateDeleteButton设置为true,并在SqlDataSource中指定delete命令。

 DeleteCommand="DELETE From [stores] WHERE [stor_id] = @stor_id"

2. 这里我们尝试在删除指定行之前显示确认消息。为此,我们必须编写一个小的Javascript代码来显示确认消息。

 function isDelete()
  {
    return confirm("Do you want to delete this row ?");
  }

3. 我们必须在删除LinkBut​​ton的OnClientClick事件上调用此Javascript函数。

<asp:LinkButton ID="DeleteBtn" runat="server" CommandName="Delete"
OnClientClick="return isDelete();">Delete</asp:LinkButton>

4. 以下ASP.NET程序显示了如何从Gridview中删除行并在删除指定行之前显示确认消息。

Default.aspx /// page

![<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
    <script type="text/javascript">
        function isDelete()
        {
            return confirm("Do you want to delete this row ?");
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false"
    AllowSorting="True" DataSourceID="SqlDataSource1" AllowPaging="True" DataKeyNames="stor_id" >
        <Columns>
        <asp:BoundField ReadOnly="True" HeaderText="stor_id"
        DataField="stor_id" SortExpression="stor_id"></asp:BoundField>
        <asp:BoundField HeaderText="stor_name" DataField="stor_name"
        SortExpression="stor_name"></asp:BoundField>
        <asp:BoundField HeaderText="stor_address" DataField="stor_address"
        SortExpression="stor_address"></asp:BoundField>
        <asp:BoundField HeaderText="city" DataField="city"
        SortExpression="city"></asp:BoundField>
        <asp:BoundField HeaderText="state" DataField="state"
        SortExpression="state"></asp:BoundField>
        <asp:BoundField HeaderText="zip" DataField="zip"
        SortExpression="zip"></asp:BoundField>
        <asp:TemplateField>
            <ItemTemplate>
                <asp:LinkButton ID="DeleteBtn" runat="server" CommandName="Delete"
                OnClientClick="return isDelete();">Delete
                </asp:LinkButton>
            </ItemTemplate>
        </asp:TemplateField>
        </Columns>
    </asp:GridView>
    <div>
    <asp:SqlDataSource ID="SqlDataSource1" runat="server"
    ConnectionString="<%$ ConnectionStrings:SQLDbConnection %>"
    SelectCommand="select * from stores"
    DeleteCommand="DELETE From \[stores\] WHERE \[stor_id\] = @stor_id" >
    <DeleteParameters>
        <asp:Parameter Name="stor_id" Type="String" />
    </DeleteParameters>
    </asp:SqlDataSource>
    </div>
    </form>
</body>
</html>]

以下是图片

Check this picture it's might help you

答案 2 :(得分:0)

如果您使用的是模型列表,则以下代码可以提供帮助:

 foreach (DataGridViewRow row in dataGridViewX.SelectedRows)
            {
                var val = (int)row.Cells[0].Value;
                Products.Remove(Products.Find(d => d.ProductId == val));
            }
            dataGridViewX.DataSource = null;
            dataGridViewX.DataSource = Products;

答案 3 :(得分:0)

您可以通过编程方式找到您要选择的行:

dataGridViewX.Rows[0].Selected = true;

然后删除所选行:

dataGridViewX.Rows.RemoveAt(dataGridViewX.SelectedRows[0].Index);

答案 4 :(得分:0)

您快到了-尝试以下代码段

if (dataGridView1.SelectedRows.Count > 0) {
   DataGridViewSelectedRowCollection row = dataGridView1.SelectedRows;
   // taking the index of the selected rows and removing/
   dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
}
else {  //optional    
   MessageBox.Show("Please select a row");
}

答案 5 :(得分:0)

我跨过这个列表,没有找到正确的答案,当您删除一行时,如果该行是集合中的第一行,则所有其他行的索引将被更改,并且您可能会删除其他行。因此,您必须循环直到selecteditems计数等于零。否则您可能会错过其他选定的行。

这是我的方法:

 while (dataGridView1.SelectedRows.Count > 0)
        dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);

答案 6 :(得分:0)

//你可以像下面这样使用

foreach(DataGridViewRow row in dgv1.SelectedRows)
{
       dgv1.Rows.Remove(row);
}