Этот код кажется очень простым, но его запуск занимает много времени. Я сделал пример проекта, включив только базовый код, и он все еще очень медленный.
У меня есть форма с кнопкой и панелью. Во время выполнения панель динамически заполняется примерно 1700 пользовательскими элементами управления. Пользовательский пользовательский элемент управления содержит одну панель и одно свойство. Нажатие кнопки на форме приводит к тому, что каждый пользовательский элемент управления меняет свой цвет. Это действие должно происходить сразу, но оно настолько медленное, что я могу наблюдать за каждым переключателем пользователя, меняющим цвет, ряд за строкой, по одному
Могу ли я приостановить обновление экрана до тех пор, пока не будет выполнено полное выполнение для каждого цикла, вместо обновления каждой панели одна за другой?
Код контроля пользователя ...
Public Class ucBox
Private _TurnedOn As Boolean
Public Property TurnedOn() As Boolean
Get
Return _TurnedOn
End Get
Set(ByVal value As Boolean)
_TurnedOn = value
If TurnedOn Then
PnlBox.BackColor = Color.Red
Else
PnlBox.BackColor = Color.LightGray
End If
End Set
End Property
Private Sub PnlBox_Click(sender As Object, e As EventArgs) Handles PnlBox.Click
If TurnedOn Then
TurnedOn = False
Else
TurnedOn = True
End If
End Sub
End Class
Код формы ...
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles Me.Load
Dim Rw As Int16 = 0, Col As Int16 = 0, x As Int16
Dim Box As ucBox
With btnTest
.Text = "Test Me"
End With
While Rw < PnlMain.Height - 10
While Col < PnlMain.Width - 10
Box = New ucBox
x = x + 1
With Box
.Top = Rw
.Left = Col
.TurnedOn = False
.Name = "Box_" & x
Col += .Width + 4
End With
PnlMain.Controls.Add(Box)
Box = Nothing
End While
Col = 0
Rw += 24
If x > 2000 Then Exit While
End While
Debug.Print("There are " & x & " boxes.")
End Sub
Private Sub btnTest_Click(sender As Object, e As EventArgs) Handles btnTest.Click
Dim StartTime As Date = Now
For Each b As ucBox In PnlMain.Controls
If b.TurnedOn Then
b.TurnedOn = False
Else
b.TurnedOn = True
End If
Next
Debug.Print("Test took " & Now.Subtract(StartTime).TotalMilliseconds)
End Sub
End Class
Я ценю любые идеи.