[英]Deleting multiple rows in datagridview
我需要删除datagridview中的前1000行。
delegate void DeleteRowsCallback();
private static void Delete1KRows()
{
JSONTest form = (JSONTest)Application.OpenForms["JSONTest"];
if (form.GridTestReport.InvokeRequired)
{
DeleteRowsCallback d = new DeleteRowsCallback(Delete1KRows);
form.GridTestReport.Invoke(d);
}
else
{
for (int i = 0; i < 1000; i++ )
{
form.GridTestReport.Rows.RemoveAt(0);
}
}
}
这会删除行,但要花费很多时间。 当删除正在进行时,UI也不响应。 任何删除多行的更好方法。
谢谢
由于您没有使用任何绑定或虚拟模式,因此每次删除一行时,都会刷新整个网格。 这将是痛苦的缓慢。
当您处理大量数据时,请使用Virtual Mode
地更新网格。
见这个 MSDN链接以获取更多信息。 有一个行人通道 。 它花费很少的时间进行设置,但是一旦完成,它将更快地通过ane简化生活。
另请参阅缩放Windows窗体DataGridView控件的最佳实践,以获取最大的DataGridView
。
这是我的工作解决方案。 首先删除数据库中的行,然后重新填充datagridview。 注意:我使用数据库访问(oledbcommand,oledbconnection等),更改您的连接。
try
{
//connectDB is the procedure to connect to database:
connectDB();
//this delete first the selected rows in database, and then update datagrid
int countRows = dataGridView1.SelectedRows.Count;
for (int i = 0; i < countRows; i++)
{
int currentRow = dataGridView1.SelectedRows[0].Index;
//con.oledbcon is the conecction is the OleDbConnection procedure, miTable = name of your table
OleDbCommand com = new OleDbCommand("DELETE FROM miTable WHERE Id=" + dataGridView1.SelectedRows[0].Cells[0].Value.ToString(), con.oledbcon);
// delete from database
com.ExecuteNonQuery();
// THIS IS THE KEY!!! deselect the last row selected to be able to delete the next row in the next loop
dataGridView1.Rows[currentRow].Selected = false;
}
// all OK
MessageBox.Show("Rows deleted!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
catch (Exception ex)
{
//in case of error
MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
finally
{
//disconnectDB is the procedure to disconnect to database:
disconnectDB();
// and finally, refill datagrid again
loaddatagrid();
}
当DataGridView活动在我的项目中运行缓慢时,通常是因为将一列或多列配置为自动调整大小,并且在删除每一行时,这种自动调整大小发生在整个网格上。 为了防止这种情况,我使用类似于以下代码:
批量删除之前:
var autoSizeModes = grid.Columns.Cast<DataGridViewColumn>).ToDictionary(col => col, col => col.AutoSizeMode);
foreach (var column in autoSizeModes.Keys)
column.AutoSizeMode = DataGridViewAutoSizeColumnMode.None;
批量删除后:
foreach (var column in autoSizeModes)
column.Key.AutoSizeMode = column.Value;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.