Могу ли я ускорить для каждого цикла - PullRequest
0 голосов
/ 28 августа 2018

Этот код кажется очень простым, но его запуск занимает много времени. Я сделал пример проекта, включив только базовый код, и он все еще очень медленный.

У меня есть форма с кнопкой и панелью. Во время выполнения панель динамически заполняется примерно 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

Я ценю любые идеи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...