2010-03-20 9 views
4

DataGridView는 약 1000 개의 행 (언 바운드)과 50 개의 열이있는 Winforms 응용 프로그램에 있습니다. 열을 숨기는 데는 2 초 정도 걸립니다. 행의 절반을 숨기려면 문제가됩니다. DataGridView의 행 숨기기가 매우 느림

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을 설정하는 것과 같은 확실한 것이 빠졌습니까? 아니면 가상 모드를 활성화하고 필요한 이벤트를 코드화해야합니까?

답변

10

대신 행 필터를 사용해야하는 것처럼 보입니다.

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 
+0

이것이 내가 끝내었고 훌륭하게 작동했습니다. 감사! –

0

그냥 일치하는 매개 변수를 데이터베이스 쿼리 나 프로 시저에 전달하고 레코드와 일치하지 않는 행을 가져올 수 있습니까? 그렇게하면 표시/숨기기에 대해 걱정할 필요가 없습니다. 더 이상 반복하지 않을뿐만 아니라 더 빠를 것입니다. 이것은 또한 시간의 경과에 따라 레코드 수가 증가함에 따라 효과가 있습니다.

당신에게 적합하지 않은 생각 일뿐입니다.

4

대부분의 경우 DataGridViewAutoSizeColumnMode 속성은 DGV를 느리게 만듭니다. 모든 열을 Mode DataGridViewAutoSizeColumnMode.None으로 변경하면 성능이 크게 향상됩니다. 그런 다음 이전 상태와 동일한 방식으로 재설정 할 수 있습니다.

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

이제 1000 개의 열 몇 개를 숨기는 데 1-2 초 밖에 걸리지 않습니다. 다른 속성 (SuspendLayout, 전체 양식 숨기기 등)을 사용하면 어떤 효과도 찾을 수 없습니다.

+0

당신은 틀린 품목입니다. 좋은 발견. –

2

위에서 언급 한 것처럼 성능을 저하시키는 DataGridViewAutoSizeColumnMode입니다. 대신에 필요한 행 로직

YourDatagridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None 

    // Perform row visibility here... 

YourDatagridView.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells 
0

DatagridView의 모든 행 통해 반복과 자동 크기 조정 모드를 변경 할을 대신 전체 Datagridview를 들어, 전원을 끈 처음으로 다음 수행 한 후 다시 켜기의 이 클래스를 사용할 수있는 AutoSizeColumnsMode 속성의 리셋에 기초한에 DataGridViewRow의 행 hidding 속도를 최적화를 구현합니다

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()