Search code examples
vb.netmschart

Running VB.Net Chart Example Not Compiling with .NET v4.0.30319


I am trying compiling with command line a sample program using MSChart control from here: https://social.msdn.microsoft.com/Forums/vstudio/en-US/95dd2d87-3750-421c-8d3a-cf6c9055acf3/read-text-file-and-plot-xy-chart?forum=vbgeneral

The code is also shown below:

Imports System
Imports System.IO
Imports System.Text
Imports System.ComponentModel
Imports System.Drawing
Imports System.Collections.Generic
Imports System.Windows.Forms
Imports System.Windows.Forms.DataVisualization.Charting


Public Class Form1


    Dim data As List(Of DoublePoint)
    Class DoublePoint
        Property X As Double
        Property Y As Double
    End Class

    Public Shared Function RoundToSignificantDigits(ByVal x As Double, ByVal n As Integer) As Double
        ' adapted from http://stackoverflow.com/questions/202302/rounding-to-an-arbitrary-number-of-significant-digits
        If x = 0 Then
            Return 0
        End If
        Dim d As Double = Math.Ceiling(Math.Log10(Math.Abs(x)))

        Dim power As Integer = n - CInt(d)
        Dim magnitude As Double = Math.Pow(10, power)
        Dim shifted As Double = Math.Round(x * magnitude, MidpointRounding.AwayFromZero)
        Return shifted / magnitude

    End Function

    Sub LoadData(src As String)

        If Not File.Exists(src) Then
            Throw New FileNotFoundException(String.Format("File not found in LoadData: ""{0}""", src))
        End If

        data = New List(Of DoublePoint)
        Dim lineNumber As Integer = 1
        Dim badLines As New StringBuilder

        Using sr = New StreamReader(src)
            Dim parts As String()
            Dim x As Double
            Dim y As Double

            While Not sr.EndOfStream
                parts = sr.ReadLine.Split({" "c}, StringSplitOptions.RemoveEmptyEntries)
                If parts.Count > 0 Then
                    If parts.Count = 3 Then
                        If Double.TryParse(parts(0), x) Then
                            If Double.TryParse(parts(1), y) Then
                                data.Add(New DoublePoint With {.X = x, .Y = y})
                            Else
                                badLines.AppendFormat("Bad line {0}: could not parse y-value {1} as a Double." & vbCrLf, lineNumber, parts(1))
                            End If
                        Else
                            badLines.AppendFormat("Bad line {0}: could not parse x-value {1} as a Double." & vbCrLf, lineNumber, parts(0))
                        End If
                    Else
                        badLines.AppendFormat("Bad line {0}: incorrect number of items ({1})." & vbCrLf, lineNumber, parts.Count())
                    End If
                End If
                lineNumber += 1
            End While
        End Using

        'TODO: inform user of bad lines in a better way
        If badLines.Length > 0 Then
            MsgBox(badLines.ToString())
        End If

    End Sub

    Sub ShowData()
        Dim minX As Double = Double.MaxValue
        Dim maxX As Double = Double.MinValue
        Dim minY As Double = Double.MaxValue
        Dim maxY As Double = Double.MinValue


        Dim Chart1 As New Chart

    Chart1.SuspendLayout()
        Chart1.Series(0).ChartType = DataVisualization.Charting.SeriesChartType.Point
        For Each p In data
            Chart1.Series(0).Points.AddXY(p.X, p.Y)

            If p.X < minX Then minX = p.X
            If p.X > maxX Then maxX = p.X

            If p.Y < minY Then minY = p.Y
            If p.Y > maxY Then maxY = p.Y
        Next

        ' attempt to get the axis limits as "neater" numbers
        minX = RoundToSignificantDigits(minX, 2)
        maxX = RoundToSignificantDigits(maxX, 2)
        minY = RoundToSignificantDigits(minY, 2)
        maxY = RoundToSignificantDigits(maxY, 2)

        Chart1.Legends.Clear()

        Chart1.ChartAreas(0).AxisX.IsStartedFromZero = False
        Chart1.ChartAreas(0).AxisY.IsStartedFromZero = False

        Chart1.ChartAreas(0).AxisX.Minimum = minX
        Chart1.ChartAreas(0).AxisX.Maximum = maxX
        Chart1.ChartAreas(0).AxisY.Minimum = minY
        Chart1.ChartAreas(0).AxisY.Maximum = maxY

        Chart1.ResumeLayout()

    End Sub

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        LoadData("chartdata.txt")

        ShowData()

    End Sub

<STAThread()> _
    Shared Sub Main()
        'Application.EnableVisualStyles()
        Application.Run(New Form1())

    End Sub

End Class

Using command: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\vbc.exe Prog.vb

The VB Compiler then throws error that "Type Chart is not Defined" which I already did in above code as "Imports System.Windows.Forms.DataVisualization.Charting" There is also some problem exist with declaration of Chart1 Object.

Any help is appreciated.


Solution

  • Finally I figured out how to compile using command line as: C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\vbc.exe /target:exe /out:MyChart /reference:System.Windows.Forms.dll,System.Windows.Forms.DataVisualization.dll Form2.vb

    I also modified the code as below:

    Imports System
    Imports System.IO
    Imports System.Text
    Imports System.ComponentModel
    Imports System.Drawing
    'Imports System.Collections.Generic
    
    Imports System.Windows.Forms
    Imports System.Windows.Forms.DataVisualization.Charting
    
    Public Class Form2
        Inherits Form
    
        Dim Chart1 As Chart
    
        Dim i As Integer = 0
        Dim j As Integer = 0
        Dim WithEvents Button1 As Button
        Dim Dp As DataPoint
    
    
        Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
            Me.Text = "Testing"
            Me.CenterToScreen()
        Me.Button1 = New Button()
        Me.Chart1 = New Chart()
        Button1.Text = "My Button Text"
        Chart1.Left = 200
        Me.Controls.Add(Chart1)
        Me.Controls.Add(Button1)
        End Sub
    
    
        Private Sub Button1_Click(sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    
        MsgBox("Button Clicked!")
        Chart1.Width = 500
        Chart1.Height = 500
        Chart1.Series.Add("Series1")
        Chart1.Series("Series1").Points.AddXY(1, 2)
        Chart1.Series("Series1").Points.AddXY(3, 2)
    
        Chart1.Series("Series1").Points.AddXY(4, 2)
        Chart1.Series("Series1").Points.AddXY(5, 0)
        Chart1.Series(0).IsVisibleInLegend = True
        Chart1.Update
        Chart1.Visible = true
    
    
    
        End Sub
    
    <STAThread()> _
        Shared Sub Main()
            Application.EnableVisualStyles()
            Application.Run(New Form2())
    
        End Sub
    
    End Class
    

    But the problem still exist It compile successfully but don't show the plotted points, just white space....