Изменение цвета точек на графике перед загрузкой формы - PullRequest
0 голосов
/ 08 ноября 2019

У меня есть таблица привязки данных в приложении winforms, написанная на vb.net. Я настроил 3 точки в моих данных и установил их цвета, но когда диаграмма заполняется во время выполнения, она игнорирует предварительно определенные точки и выбирает случайные цвета.

Чтобы обойти это, я имеюдобавлены 3 строки кода, чтобы вручную установить цвета точек после генерации данных. Я попытался поместить это в событие Load и событие Shown, но каждый раз, когда это происходит сбой из-за того, что ссылка находится за пределами индекса.

Я думаю, что это происходит, потому что форма еще не отображается на экранеи поэтому точки на самом деле еще не существуют.

Я попытался вставить код в кнопку и щелкнуть по ней после загрузки диаграммы, и это успешно изменило цвета.

Кодв Load событие:

Me.Prod_ChecklistGraphTableAdapter.Fill(Me.ProdGraph.prod_ChecklistGraph)

код в Shown или ниже указанной выше строки в Load событие:

chtActiveStatus.Series(0).Points(0).Color = Color.FromArgb(180, 204, 112)
chtActiveStatus.Series(0).Points(1).Color = Color.FromArgb(255, 200, 61)
chtActiveStatus.Series(0).Points(2).Color = Color.FromArgb(255, 61, 61)

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

1 Ответ

0 голосов
/ 08 ноября 2019

Это происходит из-за того, что ваш метод .Fill работает (занят потоком и блокирует рендеринг).

Попробуйте вызвать

Me.Prod_ChecklistGraphTableAdapter.Fill(Me.ProdGraph.prod_ChecklistGraph)

в асинхронном режиме

Или попробуйте это:

    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown
        changeColoursAsync(Nothing, Nothing)
    End Sub

    Private Sub changeColoursAsync(sender As Object, e As EventArgs)

        If sender Is Nothing Then

            Dim starter As Timer = New Timer
            starter.Interval = 1
            AddHandler starter.Tick, AddressOf changeColoursAsync
            starter.Start()
            Exit Sub

        End If

        CType(sender, Timer).Stop()
        CType(sender, Timer).Dispose()


        chtActiveStatus.SuspendLayout()

        chtActiveStatus.Series(0).Points(0).Color = Color.FromArgb(180, 204, 112)
        chtActiveStatus.Series(0).Points(1).Color = Color.FromArgb(255, 200, 61)
        chtActiveStatus.Series(0).Points(2).Color = Color.FromArgb(255, 61, 61)

        Application.DoEvents()

        chtActiveStatus.ResumeLayout()

        Console.WriteLine("Timer tick")

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