0

I have a while loop that parses a csv file, and inserts the variables into a series of arrays. This is called by a button on my main form.

These variables are used for a chart (which is in the same sub) and also for a datagrid, which is on a separate form.

The first time I click the button, everything works as normal, however if I click it a second time, the datagrid on the separate form is not populated, as I am losing the variables.

So within the while loop which parses the CSV file, I have this:

frmNumericChart.DataGridView1.Rows.Add(freq, dBu, dbnorm, ScaleFactor)

I have tried making the variables public, however because they are arrays, and constructed from the while loop, I can't seem to make them publicly accessible.

My code (edited for brevity)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

   Dim sFile As String = strFileName
    ' get the minimum and maximum frequencies
    Dim Lines As Collections.Generic.IEnumerable(Of String) = File.ReadLines(strFileName)
    Dim Line0 As String = Lines.FirstOrDefault
    Dim LineN As String = Lines.LastOrDefault
    Dim lowestFreq As String() = Line0.Split(New Char() {","c})
    Dim highestFreq As String() = LineN.Split(New Char() {","c})
    Dim lowFreq As String = lowestFreq(0)
    Dim highFreq As String = highestFreq(0)
    Dim refFrequencyX = Lines(18)
    Dim refFreq As String() = refFrequencyX.Split(New Char() {","c})
    Dim ScaleFactor As String = refFreq(1)

    Using sr As New StreamReader(sFile)
        While Not sr.EndOfStream
            Dim sLine As String = sr.ReadLine()
            If Not String.IsNullOrWhiteSpace(sLine) Then
                sData = sLine.Split(","c)
                arrName.Add(sData(0).Trim())
                arrValue.Add(sData(1).Trim())
            End If

            Dim freq As Decimal = sData(0)
            Dim dBu As Decimal = sData(1)
            Dim voltage As Decimal = sData(1)
            ' dbnorm - normalise output to 0dBu ref 1kHz
            Dim dbnorm = Math.Round(dBu - ScaleFactor, 4)
            frmNumericChart.DataGridView1.Rows.Add(freq, dBu, dbnorm, ScaleFactor)
            Chart1.Series(0).Points.AddXY(freq, dbnorm)

        End While
    End Using

' ( chart is constructed here )

end sub

How can I make these array variables global?

Please excuse my shoddy code - I am doing this as a hobby and learning as I go along.

Tony
  • 687
  • 1
  • 6
  • 15

1 Answers1

0

I solved this by adding a public class into a module.

Inside the 'Public Class' I have 'Public Shared Sub' for the subs I want access to from anywhere within the code.

Example:

Public Module Module1

<various public variables here>

Public Class MyData

        Public Shared Sub debugTempFile()
            ' DEBUG
            Dim mytempFolder As String = Path.GetTempPath()
            Dim MyOutFile As String = mytempFolder + "outfile.txt"
            Dim myfile As System.IO.StreamWriter
            myfile = My.Computer.FileSystem.OpenTextFileWriter(MyOutFile, True)
            myfile.WriteLine(debugdata)
            myfile.Close()
            ' END DEBUG
        End Sub
End Class
End Module

This Public Sub can be called from anywhere using the call statement:

Call MyData.debugTempFile()

I hope this is of use to other beginners like myself.

Tony
  • 687
  • 1
  • 6
  • 15