Search code examples
sqlvb.netvisual-studiochartsseries

Visual Studio .NET Chart Bug


This post is about what I think is a VS bug. The issue is about the view the Chart gives when I load as DataSource a single-row query result with these columns

  • DATE MYDATE
  • double LIABILITIES
  • double MARGIN
  • double NET_INTEREST

I have 3 series in my Stacked Columns Chart, but when I load the new DataSource (when single-lined) I see

this

instead of

this

Since I can't find a reasonable explanation about this inconvenience I would ask you if some one have ever experienced something similar.

Also, I know someone will complain about lack of code, but I really have no clue if a mistake it's hidden inside my code (and it's really a lot), which part could be relevant. If someone has a clue feel free to write.

P.S. strangely when the Date variable is stored as string I see the block correctly, but obviously my X Axis has no labels.

Thanks to everyone

EDIT:

Below the 'clean' code

Imports System.Windows.Forms.DataVisualization.Charting
Imports System.IO
Imports Microsoft.Office.Interop
Imports System.Data.SqlClient
Imports System.Data.OleDb

Public Class Form1

    Dim ConnectionString As String = "Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=MyAddress\File.mdf;Integrated Security=True;"

    Private Sub Form5_Load(sender As Object, e As EventArgs) Handles Me.Load

        '// Initial Load

        Dim dt As New DataTable
        Using cn = New SqlClient.SqlConnection
            cn.ConnectionString = ConnectionString
            cn.Open()
            Using cmd = cn.CreateCommand
                cmd.CommandText = "SELECT MYDATE,SUM(LIABILITIES) AS LIABILITIES, 
                                   SUM(MARGIN) AS MARGIN,
                                   SUM(NET_INTEREST) AS NET_INTEREST
                                   FROM CHART 
                                   GROUP BY MYDATE
                                   ORDER BY MYDATE
                                   "
                Using adap As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(cmd)
                    adap.Fill(dt)
                End Using
            End Using
        End Using

        '// Data Source

        Me.Chart1.DataSource = dt
        Me.Chart1.DataBind()

        '// Series

#Region "Series Liabilities"
        '// Series 1 - Liabilities
        Dim Liabilities As Series = New Series("Liabilities")
        Me.Chart1.Series.Add(Liabilities)
        Me.Chart1.Series("Liabilities").ChartType = SeriesChartType.StackedColumn
        Me.Chart1.Series("Liabilities").XValueMember = "MYDATE"
        Me.Chart1.Series("Liabilities").YValueMembers = "LIABILITIES"
#End Region

#Region "Series Margin"
        '// Series 2 - Margin
        Dim Margin_Interest As Series = New Series("Margin")
        Me.Chart1.Series.Add(Margin_Interest)
        Me.Chart1.Series("Margin").ChartType = SeriesChartType.StackedColumn
        Me.Chart1.Series("Margin").XValueMember = "MYDATE"
        Me.Chart1.Series("Margin").YValueMembers = "MARGIN"
#End Region

#Region "Series Net Interest"
        '// Series 3 - NET_INTEREST
        Dim NET_INTEREST As Series = New Series("Net Interest")
        Me.Chart1.Series.Add(NET_INTEREST)
        Me.Chart1.Series("Net Interest").ChartType = SeriesChartType.StackedColumn
        Me.Chart1.Series("Net Interest").XValueMember = "MYDATE"
        Me.Chart1.Series("Net Interest").YValueMembers = "NET_INTEREST"
#End Region

        '// AxisX

        'Me.Chart1.ChartAreas(0).AxisX.Interval = 1       
        'Me.Chart1.ChartAreas(0).AxisX.IsLabelAutoFit = True
        'Me.Chart1.ChartAreas(0).AxisX.LabelStyle.Format = "MMMM"

    End Sub

    Private Sub btnLast30Days_Click(sender As Object, e As EventArgs) Handles btnLast30Days.Click
        UpdateFilters()
    End Sub

    Sub UpdateFilters()
        Dim str As String = "SELECT MYDATE, 
                            SUM(LIABILITIES) AS LIABILITIES,
                            SUM(MARGIN) AS MARGIN,
                            SUM(NET_INTEREST) AS NET_INTEREST
                            FROM CHART 
                            WHERE MYDATE = '2023-08-31'
                            GROUP BY MYDATE
                            ORDER BY MYDATE"

        Dim dt As New DataTable
        Using cn = New SqlClient.SqlConnection
            cn.ConnectionString = ConnectionString
            cn.Open()
            Using cmd = cn.CreateCommand
                cmd.CommandText = str
                Using adap As SqlClient.SqlDataAdapter = New SqlClient.SqlDataAdapter(cmd)
                    adap.Fill(dt)
                End Using
            End Using
        End Using
        Me.Chart1.DataSource = dt
        Me.Chart1.DataBind()
    End Sub

End Class

Solution

  • I can confirm your problem.

    It can be resolved by explicitly setting the Series.XValueType to ChartValueType.Date or ChartValueType.Datetime. The default is ChartValueType.Auto and for some reason fails when only charting one data record.

    i.e.

    Me.Chart1.Series("Liabilities").XValueType = ChartValueType.DateTime
    

    Do this for each series.