2016-07-01 2 views
0

У меня есть цикл while, который анализирует файл csv и вставляет переменные в ряд массивов. Это называется кнопкой на моей основной форме.Сохранение переменных, сгенерированных циклом while

Эти переменные используются для диаграммы (которая находится в одном и том же суб), а также для datagrid, которая находится в отдельной форме.

В первый раз, когда я нажимаю кнопку, все работает нормально, однако, если я нажму на нее второй раз, datagrid на отдельной форме не будет заполнен, так как я теряю переменные.

Так в то время цикла, который анализирует файл CSV, у меня есть это:

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

Я попытался сделать переменные общественности, однако, поскольку они являются массивами, и построен из цикла в то время как я могу» похоже, делают их общедоступными.

Моего код (отредактированный для краткости)

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 

Как я могу сделать этот переменный массив глобальным?

Прошу прощения за мой дрянной код - я делаю это как хобби и обучение, когда я иду.

+0

См. [Справочные переменные и объекты в другом месте в форме] (http://stackoverflow.com/q/33248704/1070452) – Plutonix

+0

Боюсь, что это мне совсем не помогает. Попытка следовать примеру, приведенному на этой странице, приводит к загрузке ошибок для меня. – Tony

ответ

0

Я решил это, добавив публичный класс в модуль.

Внутри «Public Class» у меня есть «Public Sub Sub Sub» для подсетей, в которых я хочу получить доступ из любого места в коде.

Пример:

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 

Это Public Sub может быть вызвана из любого места с помощью оператора вызова:

Call MyData.debugTempFile() 

Я надеюсь, что это полезным для других новичков, как я.

Смежные вопросы