【问题标题】:Changing point colours on chart before form loaded在加载表单之前更改图表上的点颜色
【发布时间】:2019-11-08 02:06:43
【问题描述】:

我在一个 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)

我的问题是,如何使此代码在向用户显示图表之前更改颜色并防止它从一种颜色闪烁到正确的颜色?或者,如何设置图表属性,使其不会忽略我设置的预定义点和颜色?

【问题讨论】:

  • 您必须在构造函数或 Load 事件中执行此操作以防止其可见。但这与您所依赖的数据绑定不兼容,这是惰性的,并且在控件变得可见之前不会发生。在考虑this Q+A 中的hackorama 之前,我会放弃数据绑定。
  • 感谢@HansPassant - 您认为放弃 SQL 视图中的数据绑定会更好吗,只需让 vb 代码提取数据并手动更新 @ 中的创建图987654327@ 或 Shown 事件?

标签: vb.net winforms


【解决方案1】:

发生这种情况是因为您的 .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

【讨论】:

  • 谢谢@G3nt_M3caj - 你的意思是在Form_Shown 事件中也调用.Fill 行吗?或者将该行添加到您在上面添加的changeColoursAsync 子中?
  • 您可以在 Form1_Shown 事件中调用 changeColoursAsync(如上面的代码所示),在 Form1_Show 事件中调用 Prod_ChecklistGraphTableAdapter.Fill。 :)
  • 对不起@G3nt_M3caj - 我想我可能是误会了。我在 Async 调用之前添加了 Prod_ChecklistGraphTableAdapter.Fill 并且它可以工作,但它仍然会短暂显示默认配色方案大约一秒半,然后轻弹到正确的颜色。
  • 嗨@RazorKillBen。应该在调用 changeColoursAsync 之后调用 Prod_ChecklistGraphTableAdapter.Fill。
猜你喜欢
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多