vb.net скрывает столбцы в DataGridView очень медленно

попытка скрыть 44 столбца DataGridView занимает 44 секунды на компьютере с Windows 7. Как я могу ускорить это? Я использовал следующий код:

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

person Topher    schedule 04.03.2013    source источник
comment
Что-то еще происходит с gridview, что вы не показываете. Например, вы повторно запрашиваете источник данных? Это может замедлить ваш ответ, но простое скрытие столбцов не должно.   -  person jason    schedule 04.03.2013
comment
Почему вы скрываете все столбцы? Нельзя ли скрыть сетку или отвязать источник данных?   -  person Esselans    schedule 05.03.2013


Ответы (2)


Измените свой цикл на этот, так как он будет перебирать столбцы и делать их невидимыми... Для моего теста, чтобы убедиться, я добавил 250 столбцов и скрыл их все примерно за секунду с помощью этого цикла...

 For i As Integer = 0 To DataGridView1.ColumnCount - 1
   DataGridView1.Columns(i).Visible = False
 End Sub

Это удалит все столбцы, если вы решите это сделать...

  For i As Integer = 0 To DataGridView1.ColumnCount - 1
   DataGridView1.Columns.Remove(DataGridView1.Columns(0).Name)
  Next

А вот еще способ...

  DataGridView1.Columns.Clear()

Что касается двойной буферизации вашего 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

Вы можете оставить приведенный выше код, если решите это сделать, это поможет в целом вашей форме и компонентам, которые находятся на ней. Вот мой фаворит для datagridview, чтобы избежать мерцания, включая полосы прокрутки...

  • 1 Поместите это в самый верх вашей формы...

    Imports System.Reflection
    
  • 2 Добавьте это в загрузку формы...

    BufferMethod.DoubleBuffered(DataGridView1, True)
    
  • 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
    

Надеемся, вам понравится!

С уважением,

MrCodexer

person zaggler    schedule 05.03.2013

Свойство столбца autosizemode, если оно настроено на автоматическую настройку в соответствии с содержимым (например, отображаемые ячейки), может замедлить работу всей сетки. Вроде перерисовывает "внутри". Я решил свои проблемы с сеткой, используя эти типы только на небольших сетках и очень экономно на других. Мне потребовалось некоторое время, чтобы понять, что это проблема, потому что не происходит никакого внешнего рисования/события, оно просто кажется очень медленным.

person Tim F.    schedule 10.12.2015