簡體   English   中英

在DataGridView中隱藏行非常慢

[英]Hiding Row in DataGridView Very Slow

我在Winforms應用程序中有一個DataGridView,它有大約1000行(未綁定)和50列。 隱藏一列需要整整2秒鍾。 當我想隱藏大約一半的行時,這就成了一個問題。

    private void ShowRows(string match)
    {
        this.SuspendLayout();
        foreach (DataGridViewRow row in uxMainList.Rows)
        {
            if (match == row.Cells["thisColumn"].Value.ToString()))
            { row.Visible = false; }
            else
            { row.Visible = true; }
        }
        this.ResumeLayout();
    }

我通過在操作周圍添加Console.WriteLine(DateTime.Now)來進行一些測試,而row.Visible = false肯定是慢點。 我錯過了一些明顯的東西,比如設置IsReallySlow = false 或者我是否必須繼續啟用虛擬模式並編寫必要的事件代碼?

在我看來,你應該使用行過濾器。

嘗試使用DataView作為綁定源,並使用DataView.RowFilter隱藏行或顯示您選擇的行。

DataGridView myGridView = new DataGridView();
DataView myDataView = myTable.DefaultView;
myGridView.DataSource = myDataView; // DataView that allows row filtering

myDataView.RowFilter = string.Format("thisColumn <> '{0}'",match);  // this will hide all rows where "thisColumn" = match

在大多數情況下,屬性DataGridViewAutoSizeColumnMode使DGV變慢。 將所有列更改為Mode DataGridViewAutoSizeColumnMode.None時,性能會急劇增加。 之后,您可以按照與之前狀態相同的方式重置它。

For Each col As DataGridViewColumn In myDGV.Columns
   col.AutoSizeMode = DataGridViewAutoSizeColumnMode.None
Next

您將看到隱藏一些1000列現在只需1-2秒。 使用其他屬性(SuspendLayout,隱藏整個表單等),我找不到任何效果。

如上所述,它會殺死性能的DataGridViewAutoSizeColumnMode 而不是循環遍歷DatagridView每一行並更改自動調整大小模式,而是通過最初將其關閉然后在執行所需的行邏輯后再次打開它來代替整個Datagridview

YourDatagridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None

     // Perform row visibility here...

YourDatagridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells

只是一個問題..是否可以將該匹配參數傳遞給數據庫查詢或過程,並獲取與記錄不匹配的行。 這樣你就不必擔心顯示/隱藏它會更快,你將不再循環。 隨着記錄數量隨時間增加,這也會有效。

只是一個可能不適合你的想法..我知道。

要實現優化以加快基於AutoSizeColumnsMode屬性重置的DataGridViewRow中行的隱藏,您可以使用此類:

Public Class DataGridViewUtil
    Private dgv As DataGridView
    Private sizeColumnModeBackup(-1) As DataGridViewAutoSizeColumnMode


    Public Sub New(dgv As DataGridView)
        Me.dgv = dgv
    End Sub

    ''' <summary>
    ''' Prepare datagridview before we do the row hidding to speedup it
    ''' </summary>
    ''' <remarks>We use a method based on reseting the AutoSizeColumnMode 
    '''  property to None, therefore it will be necessary to call
    '''  HidingRowsSpeederAfer() when we finish hiding rows</remarks>
    Public Sub HidingRowsSpeederBefore()
        ReDim sizeColumnModeBackup(dgv.Columns.Count)
        For Each col As DataGridViewColumn In dgv.Columns
            sizeColumnModeBackup(col.Index) = col.AutoSizeMode
            col.AutoSizeMode = DataGridViewAutoSizeColumnMode.None
        Next
    End Sub

    ''' <summary>
    ''' Restore DataGridView state changed when HidingRowsSpeederBefore() 
    '''  was called
    ''' </summary>
    ''' <remarks>This procedure must be called after the row hidding has been
    '''   done and requires a previous call to HidingRowsSpeederBefore()</remarks>
    Public Sub HidingRowsSpeederAfter()
        If dgv Is Nothing Then
            Throw New NullReferenceException("The assigned datagridview is null")
        End If
        If sizeColumnModeBackup.Length < dgv.Columns.Count Then
            Throw New Exception("Mismatch on internal SizeColumnMode array, " &
                    "maybe you forgot to call HidingRowsSpeederBefore()")
        End If
        For Each col As DataGridViewColumn In dgv.Columns
            col.AutoSizeMode = sizeColumnModeBackup(col.Index)
        Next
    End Sub
End Class

如何使用它:

    Dim dgvUtil As New DataGridViewUtil(yourDataGridView)
    dgvUtil.HidingRowsSpeederBefore()

    '... do your row hidding chores here

    dgvUtil.HidingRowsSpeederAfter()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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