簡體   English   中英

在datagridview中刪除多行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM