vb.net在DataGridView中隐藏列非常慢

Top*_*her 1 vb.net datagridview doublebuffered .net-4.0 visual-studio-2010

在 Windows 7 计算机上尝试隐藏 DataGridView 的 44 列需要 44 秒。我怎样才能加快速度?我使用了以下代码:

 'Turn on DataGridView.DoubleBuffered
 Dim myType As Type = GetType(DataGridView)
 myType.InvokeMember( _
   "DoubleBuffered", _
    BindingFlags.NonPublic Or BindingFlags.Instance Or BindingFlags.SetProperty, _
    Nothing, DataGridView1, New Object() {True})

 'hide the following columns
 Me.SuspendLayout()
 For Each col As DataGridViewColumn In DataGridView1.Columns
    col.Visible = False
 Next
 Me.ResumeLayout()
Run Code Online (Sandbox Code Playgroud)

Çöđ*_*xěŕ 5

将您的循环更改为此,因为这将遍历列并使它们不可见......为了我的测试只是为了确保,我添加了 250 列并在大约一秒钟内使用此循环将它们全部隐藏......

 For i As Integer = 0 To DataGridView1.ColumnCount - 1
   DataGridView1.Columns(i).Visible = False
 End Sub
Run Code Online (Sandbox Code Playgroud)

如果您选择这样做,这将删除所有列...

  For i As Integer = 0 To DataGridView1.ColumnCount - 1
   DataGridView1.Columns.Remove(DataGridView1.Columns(0).Name)
  Next
Run Code Online (Sandbox Code Playgroud)

这是另一种方式......

  DataGridView1.Columns.Clear()
Run Code Online (Sandbox Code Playgroud)

至于您对 datagridview 进行双缓冲,对表单进行双缓冲,因为它会减少该表单上发生的任何闪烁。这里有两个选项:1 - 在属性窗口中为您的表单设置双缓冲区或 2 - 初始化另一个子程序以对其进行双缓冲...

这是表单双缓冲的代码......将它直接放在你的类名下......

 Public Sub New()
    MyBase.New()

    MyBase.DoubleBuffered = True
    ' This call is required by the designer.
    InitializeComponent()

    ' Add any initialization after the InitializeComponent() call.
 End Sub
Run Code Online (Sandbox Code Playgroud)

如果您选择这样做,您可以保留上面的代码,这将有助于您的表单和位于其上的组件的整体。这是我最喜欢的数据网格视图,以避免任何闪烁,包括滚动条......

  • 1 把它放在表格的最顶部......

    Imports System.Reflection
    
    Run Code Online (Sandbox Code Playgroud)
  • 2 将此添加到您的表单加载...

    BufferMethod.DoubleBuffered(DataGridView1, True)
    
    Run Code Online (Sandbox Code Playgroud)
  • 3 在其他课程的最后(在 End Class 下面)放下这个新课程

    Public NotInheritable Class BufferMethod
      Public Shared Sub DoubleBuffered(dgView As DataGridView, Setting As Boolean)
          Dim dgvType As Type = dgView.[GetType]()
          Dim propInfo As PropertyInfo = dgvType.GetProperty("DoubleBuffered", BindingFlags.Instance Or BindingFlags.NonPublic)
          propInfo.SetValue(dgView, Setting, Nothing)
      End Sub
    End Class
    
    Run Code Online (Sandbox Code Playgroud)

希望你喜欢!

问候,

程序员先生