是否可以从单个数据源具有多个图表控件实例

时间:2014-09-07 00:55:21

标签: vb.net charts

有没有办法可以创建一个总是从同一个数据源填充的图表控件,但是我可以在我的应用程序中放置多个控件实例?

例如,假设我有一个图表控件,显示本周所有用户的工作计数。我从数据库中提取数据(在计时器控件上)并更新图表。这对单个实例来说很好。

但是,是否可以将相同的图表放在从同一数据自动更新的不同表单(甚至是其他两种表单)上?而不是必须在每个图表的单独计时器上运行单独的查询?

我猜一个类可能是要走的路,但我不确定如何正确设置它。

更新

很抱歉与我的帖子有任何混淆。我的例子是我在从数据库填充的表单上有一个图表。我想让用户能够根据需要将该图表的“副本”添加到他们的仪表板中。因此,我需要两个图表,然后同时从相同的数据更新而不运行多个查询。希望这是有道理的。

1 个答案:

答案 0 :(得分:0)

控件只能是父母一方的孩子。 但是,如果克隆应该只是可见而不是交互式,则可以使用一些简单的解决方法:

Public Class CloneChartControl
    Inherits System.Windows.Forms.DataVisualization.Charting.Chart

    'Add pictureboxes to this list that should show the data
    Public Clones As List(Of PictureBox)

    Private paintclones As Boolean = True
    Private oldbmp As Bitmap

    'Override the paint event
    Protected Overrides Sub OnPaint(e As PaintEventArgs)
        MyBase.OnPaint(e)

        'Reasons not to paint the clones
        If paintclones = False Then Exit Sub
        If Clones Is Nothing Then Exit Sub

        Dim bmp As New Bitmap(Me.ClientRectangle.Width, Me.ClientRectangle.Height)

        'Disable the drawing of the clones while the chart's bitmap is drawn (recursiveness, will call OnPaint itself)
        paintclones = False
        Me.DrawToBitmap(bmp, Me.ClientRectangle)
        paintclones = True

        'Clean up the old image
        If oldbmp IsNot Nothing Then oldbmp.Dispose()
        oldbmp = bmp

        'Set the new image to all clone pictureboxes
        For Each p As PictureBox In Clones
            p.Image = bmp
        Next
    End Sub
End Class

想法是将图表绘制到位图并将位图设置为用作克隆的图片框的图像。每当重绘图表时,图片框也会更新。

不幸的是,图表似乎没有用.DrawToBitmap方法中作为参数给出的界限来绘制自己。我首先得到了一个类的草稿,它将为每个具有图片框界限的单个图片框创建一个新的位图,但图表仍然只会绘制其旧的大小。因此我稍微简化了代码。