删除datagridview中的多行

时间:2014-02-06 05:58:19

标签: c# .net winforms 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也没有响应。删除多行的更好方法。

谢谢

3 个答案:

答案 0 :(得分:0)

由于您没有使用任何绑定或虚拟模式,因此每次删除行时,都会刷新整个网格。这将是非常缓慢的。

在处理大量数据时,使用Virtual Mode有效地更新网格。

有关详细信息,请参阅this MSDN链接。有一个Walkhrough可用。它需要很少的时间来设置,但一旦完成它会更快,使生活更轻松。

另请参阅Best Practices for Scaling the Windows Forms DataGridView Control以获得最大值DataGridView

答案 1 :(得分:0)

有我的工作解决方案。 首先删除数据库中的行,然后重新填充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();
}

答案 2 :(得分:0)

当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;