如何从 DataGridView 中删除选定的行?
How to delete selected rows from a DataGridView?
我有一个 DataGridView
和一个 Button
。如果选择了行,我想通过单击按钮删除它们。我尝试了几个命令,如 RemoveAt
、SelectedRows
等,但没有任何效果。我该如何解决?
我试过类似的方法:
if (dataGridView2.SelectedRows.Count > 0)
{
DataGridViewSelectedRowCollection rows = dataGridView2.SelectedRows;
dataGridView2.Rows.RemoveAt(rows);
}
但是 RemoveAt 方法只接受整数。在我尝试使用 Selected Cells 之前,他删除了所有行,因为总有一个单元格被选中。
如果您只想从 DataGridView
中删除选定的行,应该这样做:
foreach (DataGridViewRow row in yourDataGridView.SelectedRows)
{
yourDataGridView.Rows.RemoveAt(row.Index);
}
您的代码无效,因为您使用了 RemoveAt(rows)
,但 RemoveAt
只接受您要删除的行的索引。您正在将 DataGridViewSelectedRowCollection
传递给它。您可以通过 DataGridViewRow.Index
获取一行的索引,如上所示。
请试试这个,希望对你有帮助
1. 要启用删除,请将 AutoGenerateDeleteButton 设置为 true 并在 SqlDataSource 中指定删除命令。
DeleteCommand="DELETE From [stores] WHERE [stor_id] = @stor_id"
2. 这里我们试图在删除指定行之前显示确认信息。为此,我们必须编写一小段 Javascript 代码来显示确认消息。
function isDelete()
{
return confirm("Do you want to delete this row ?");
}
3. 我们必须在删除 LinkButton 的 OnClientClick 事件上调用此 Javascript 函数。
<asp:LinkButton ID="DeleteBtn" runat="server" CommandName="Delete"
OnClientClick="return isDelete();">Delete</asp:LinkButton>
4. 下面的 ASP.NET 程序展示了如何从 Gridview 中删除行并在删除指定行之前显示确认消息。
Default.aspx /// 页面
![<!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>]
这是图片
如果您使用的是模型列表,以下代码可能会有所帮助:
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;
您可以通过编程方式找到您要查找的行 select:
dataGridViewX.Rows[0].Selected = true;
然后删除 selected 行:
dataGridViewX.Rows.RemoveAt(dataGridViewX.SelectedRows[0].Index);
您快完成了 - 试试下面的代码片段
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");
}
我遇到了这个,但没有找到正确答案,当你删除一行时,如果这一行是集合中的第一行,所有其他行的索引都会改变,你可以删除其他 rows.so 你必须循环直到 selecteditems 计数等于零。或者您可能会错过其他选定的行。
这是我的方法:
while (dataGridView1.SelectedRows.Count > 0)
dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
//你可以像下面这样使用
foreach(DataGridViewRow row in dgv1.SelectedRows)
{
dgv1.Rows.Remove(row);
}
我有一个 DataGridView
和一个 Button
。如果选择了行,我想通过单击按钮删除它们。我尝试了几个命令,如 RemoveAt
、SelectedRows
等,但没有任何效果。我该如何解决?
我试过类似的方法:
if (dataGridView2.SelectedRows.Count > 0)
{
DataGridViewSelectedRowCollection rows = dataGridView2.SelectedRows;
dataGridView2.Rows.RemoveAt(rows);
}
但是 RemoveAt 方法只接受整数。在我尝试使用 Selected Cells 之前,他删除了所有行,因为总有一个单元格被选中。
如果您只想从 DataGridView
中删除选定的行,应该这样做:
foreach (DataGridViewRow row in yourDataGridView.SelectedRows)
{
yourDataGridView.Rows.RemoveAt(row.Index);
}
您的代码无效,因为您使用了 RemoveAt(rows)
,但 RemoveAt
只接受您要删除的行的索引。您正在将 DataGridViewSelectedRowCollection
传递给它。您可以通过 DataGridViewRow.Index
获取一行的索引,如上所示。
请试试这个,希望对你有帮助
1. 要启用删除,请将 AutoGenerateDeleteButton 设置为 true 并在 SqlDataSource 中指定删除命令。
DeleteCommand="DELETE From [stores] WHERE [stor_id] = @stor_id"
2. 这里我们试图在删除指定行之前显示确认信息。为此,我们必须编写一小段 Javascript 代码来显示确认消息。
function isDelete()
{
return confirm("Do you want to delete this row ?");
}
3. 我们必须在删除 LinkButton 的 OnClientClick 事件上调用此 Javascript 函数。
<asp:LinkButton ID="DeleteBtn" runat="server" CommandName="Delete"
OnClientClick="return isDelete();">Delete</asp:LinkButton>
4. 下面的 ASP.NET 程序展示了如何从 Gridview 中删除行并在删除指定行之前显示确认消息。
Default.aspx /// 页面
![<!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>]
这是图片
如果您使用的是模型列表,以下代码可能会有所帮助:
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;
您可以通过编程方式找到您要查找的行 select:
dataGridViewX.Rows[0].Selected = true;
然后删除 selected 行:
dataGridViewX.Rows.RemoveAt(dataGridViewX.SelectedRows[0].Index);
您快完成了 - 试试下面的代码片段
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");
}
我遇到了这个,但没有找到正确答案,当你删除一行时,如果这一行是集合中的第一行,所有其他行的索引都会改变,你可以删除其他 rows.so 你必须循环直到 selecteditems 计数等于零。或者您可能会错过其他选定的行。
这是我的方法:
while (dataGridView1.SelectedRows.Count > 0)
dataGridView1.Rows.RemoveAt(dataGridView1.SelectedRows[0].Index);
//你可以像下面这样使用
foreach(DataGridViewRow row in dgv1.SelectedRows)
{
dgv1.Rows.Remove(row);
}