2016-07-01 10 views
0

Ich habe eine while-Schleife, die eine CSV-Datei analysiert und die Variablen in eine Reihe von Arrays einfügt. Dies wird über einen Button auf meinem Hauptformular aufgerufen.Von einer While-Schleife generierte Variablen

Diese Variablen werden für ein Diagramm (das sich in demselben Unterverzeichnis befindet) und auch für ein Datagrid verwendet, das sich in einem separaten Formular befindet.

Das erste Mal, wenn ich auf die Schaltfläche klicke, funktioniert alles wie normal, wenn ich jedoch ein zweites Mal klicke, wird das Datagrid auf dem separaten Formular nicht ausgefüllt, da ich die Variablen verliere.

Also innerhalb der while-Schleife, die die CSV-Datei analysiert, ich habe dies:

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

Ich habe versucht, die Variablen öffentlich zu machen, aber weil sie Arrays sind, und aus der while-Schleife konstruiert, kann ich‘ Sie scheinen sie öffentlich zugänglich zu machen.

Mein Code (der Kürze halber bearbeitet)

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 

Wie kann ich diese globalen Array-Variablen?

Bitte entschuldigen Sie meinen schäbigen Code - ich mache das als ein Hobby und lerne, während ich mitfahre.

+0

Bitte beachten Sie [Referenzvariablen und Objekte an anderer Stelle in einem Formular] (http://stackoverflow.com/q/33248704/1070452) – Plutonix

+0

Ich fürchte, das hilft mir überhaupt nicht. Der Versuch, dem Beispiel auf dieser Seite zu folgen, führt zu einer Menge von Fehlern für mich. – Tony

Antwort

0

Ich löste dies durch Hinzufügen einer öffentlichen Klasse in ein Modul.

Innerhalb der 'Public Class' habe ich 'Public Shared Sub' für die Subs, auf die ich von überall innerhalb des Codes zugreifen möchte.

Beispiel:

Call MyData.debugTempFile() 

Ich hoffe, diese Nutzungs ist wie ich auf andere Anfänger:

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 

Dieses Public Sub kann von jedem beliebigen Ort mit dem Aufruf-Anweisung aufgerufen werden.