VB Zapis z tablicy do pliku

0

Witam chciałem zapytać w czym tkwi błąd, zrobiłem taki zapisz do pliku ale działa on nie do końca tak jak powinien. Ponieważ zapisuje on aktualnie przeglądany rekord ale nie przechodzi do następnego numeru w tablicy i nie zapisuje kolejnych rekordów w pliku. Dodam że zmienna aktualna pozycja jest to aktualnie wyświetlany rekord na formatce a numer jest to liczba wszystkich elementów w tablicy.

Private Sub ZapiszJakoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ZapiszJakoToolStripMenuItem.Click
        Dim myStream As IO.StreamWriter

        Dim savefiledialog As New SaveFileDialog

        If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
                myStream = New System.IO.StreamWriter(SaveFileDialog1.FileName)

            With tablica(aktualna_pozycja)

                While aktualna_pozycja <= numer
                    myStream.WriteLine(TextBox1.Text)
                    myStream.WriteLine(TextBox2.Text)
                    myStream.WriteLine(TextBox3.Text)
                    myStream.WriteLine(MaskedTextBox1.Text)
                    myStream.WriteLine(MaskedTextBox2.Text)
                    myStream.WriteLine(TextBox6.Text)
                    myStream.WriteLine(MaskedTextBox5.Text)
                    myStream.WriteLine(MaskedTextBox4.Text)
                    myStream.WriteLine(MaskedTextBox3.Text)
                    If RadioButton1.Checked = True Then
                        myStream.WriteLine(RadioButton1.Text)
                    Else
                        myStream.WriteLine(RadioButton2.Text)
                    End If


                    If RadioButton3.Checked = True Then
                        myStream.WriteLine(RadioButton3.Text)
                        If RadioButton4.Checked = True Then
                            myStream.WriteLine(RadioButton4.Text)
                        End If

                    End If
                    myStream.WriteLine(ComboBox1.SelectedItem)
                    myStream.WriteLine(ComboBox2.SelectedItem)
                    myStream.WriteLine(ComboBox3.SelectedItem)
                    myStream.WriteLine(ComboBox1.SelectedItem)
                    myStream.WriteLine(ComboBox2.SelectedItem)
                    myStream.WriteLine(Label14.Text)

                    myStream.Close()                        <---------------- jeżeli w tym miejscu zamykam to wyskakuje błąd przy zapisie ze "Cannot write to a closed TextWriter." okej oczywiste ze nie moge zakończyć w tym miejscu ale nie wiem czy pętle musze zmienić jakoś czy co 

                End While
`myStream.Close()       <-------------- jak dam w tym miejscu to znowu zapisuje setki razy dane z tego elementu tablicy i również nie przechodzi do następnego
            End With

            OpenFileDialog1.FileName = SaveFileDialog1.FileName
        End If

    End Sub 
1

Uprośćmy kodaby był czytelny dla przykładu:

Private Sub ZapiszJakoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ZapiszJakoToolStripMenuItem.Click
        Dim myStream As IO.StreamWriter
 
        Dim savefiledialog As New SaveFileDialog
 
        If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
                myStream = New System.IO.StreamWriter(SaveFileDialog1.FileName)
 
            With tablica(aktualna_pozycja) ' po co ten blok skoro nie odwołujesz się w nim do tablica(aktualna_pozycja)
 
                While aktualna_pozycja <= numer
                     'usunąłem linie zapisujące do pliku
                     'jak chcez wyjść pętli skoro żadna linijka nie wpływa najej warunek?
                End While
`myStream.Close()       <-------------- jak dam w tym miejscu to znowu zapisuje setki razy dane z tego elementu tablicy i również nie przechodzi do następnego
            End With
 
            OpenFileDialog1.FileName = SaveFileDialog1.FileName
        End If
 
    End Sub 
1

Nie działa bo występuje błąd logiczny. Najpierw With, które działa na pojedynczym rekordzie, a potem While, które jedzie pętlę po tym wpisie. I za kążdym razem kończy się to zamknięciem streamera. Masz warunek While "aktualna_pozycja <= numer", ale ten "numer" się nie zmienia - wpadniesz w "wieczną pętle" Jeżeli dasz "mystreamer.Close() po "End while", a jeśli przed to po pierwszej pętli i tak nastapi zamknięcie streamera. Jeśli tworzysz obiekty warto używać dyrektywy "Using", która również w VB.NET jest dostępna. Ona wyczyści wszystko za Ciebie.

1

Sprostowanie. Iteracja następuje po pozycji "aktualna_pozycja", ale to nie zmienia postaci rzeczy.

0

Orzeł mógłbyś podać przykład jakiś ?

1

Przykład z using z MSDN nawet bazuje na StreamReader, w twoim kodzie to będzie tak:

Private Sub ZapiszJakoToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ZapiszJakoToolStripMenuItem.Click
        Dim myStream As IO.StreamWriter
 
        Dim savefiledialog As New SaveFileDialog
 
        If SaveFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
			Using myStream As IO.StreamWriter = New System.IO.StreamWriter(SaveFileDialog1.FileName)
				With tablica(aktualna_pozycja)
	 
					While aktualna_pozycja <= numer
						myStream.WriteLine(TextBox1.Text)
						myStream.WriteLine(TextBox2.Text)
						myStream.WriteLine(TextBox3.Text)
						myStream.WriteLine(MaskedTextBox1.Text)
						myStream.WriteLine(MaskedTextBox2.Text)
						myStream.WriteLine(TextBox6.Text)
						myStream.WriteLine(MaskedTextBox5.Text)
						myStream.WriteLine(MaskedTextBox4.Text)
						myStream.WriteLine(MaskedTextBox3.Text)
						If RadioButton1.Checked = True Then
							myStream.WriteLine(RadioButton1.Text)
						Else
							myStream.WriteLine(RadioButton2.Text)
						End If	 
						If RadioButton3.Checked = True Then
							myStream.WriteLine(RadioButton3.Text)
							If RadioButton4.Checked = True Then
								myStream.WriteLine(RadioButton4.Text)
							End If	 
						End If
						myStream.WriteLine(ComboBox1.SelectedItem)
						myStream.WriteLine(ComboBox2.SelectedItem)
						myStream.WriteLine(ComboBox3.SelectedItem)
						myStream.WriteLine(ComboBox1.SelectedItem)
						myStream.WriteLine(ComboBox2.SelectedItem)
						myStream.WriteLine(Label14.Text)	 
					End While
				End With
			End Using 
            OpenFileDialog1.FileName = SaveFileDialog1.FileName
        End If
 
    End Sub
0

Tak ale nadal nie przeskakuje do następnego elementu tylko zapisuje setki razy to samo ;//

0

A czytasz ze zrozumieniem odpowiedzi do pytań, które zadajesz?

Pętla

While aktualna_pozycja <= numer
    'kod twojej do zapisywania do pliku
End While

wykonuje się tak długo jak długo warunek jest spełniony. W Twoim kodzie wewnątrz pętli w żaden sposób nie wpływasz na ten warunek. więc wypadałoby zmodyfikować kod aby ten warunek się zmienił:

While aktualna_pozycja <= numer
    'kod twojej do zapisywania do pliku
    aktualna_pozycja++
End While

Na marginesie dodam, że tu aż prosi się o pętle FOR...Next bo w końcu znasz ilość powtórzeń:

For i as Integer = aktualna_pozycja To numer
    'kod twojej do zapisywania do pliku
Next
0

Okej, poprawiłem tak jak zalecałeś. Wygląda to tak

For i As Integer = aktualna_pozycja To numer Step 1
                    With tablica(aktualna_pozycja)

                   `kod zapisywania do pliku
 aktualna_pozycja = +1
                    End With
                Next i 

Czemu skoro (chyba) dobrze mam ustawioną pętle to wypisuje mi dane jednej osoby ale tym razem TYLKO tyle razy ile jest elementów w tablicy ?

1

Kiler1233, nie wiem nie mam szklanej kuli, jedyne co mi się rzuca w oczy to to, że zapisujesz do pliku DANE Z KONTROLEK formularza, a podejrzewam, że chodzi Ci o zmienną "tablica" ale z kodu nic o niej nie wiadomo...

Zmiana indeksu tablicy nie zmienia przecież danych na formie.

dodatkow taki zapis:

aktualna_pozycja = +1

zawsze przypisuje 1 do zmiennej jak już to:

aktualna_pozycja += 1

Nie wyłapałeś bo w tym kodzie wartość tej zmiennej nie ma znaczenia...

0

Dzieki że uświadomiłeś mi gdzie jest błąd, masz racje zapisywane były dane z kontrolek a nie z tablicy struktur. Wystarczyło zmienić w nawiasach na odpowiednie zmienne ze struktury a nie jak do tej pory kontrolki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1