简体   繁体   中英

How to save the names of clicked objects to a text file (Visual Basic)

I am doing a cinema booking system as my A-Level Computing project, I am using labels as seats, when they are clicked they turn green and I am trying to save the name of each clicked label to an array that will be later saved to a file. This is the procedure for when a seat is clicked:

    Private Sub lblA1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lblA1.Click, lblA2.Click, lblA3.Click, lblA4.Click, lblA5.Click, lblA6.Click, lblA7.Click, lblB1.Click, lblB2.Click, lblB3.Click, lblB4.Click, lblB5.Click, lblB6.Click, lblB7.Click, lblC1.Click, lblC2.Click, lblC3.Click, lblC4.Click, lblC5.Click, lblC6.Click, lblC7.Click, lblD1.Click, lblD2.Click, lblD3.Click, lblD4.Click, lblD5.Click, lblD6.Click, lblD7.Click, lblE1.Click, lblE2.Click, lblE3.Click, lblE4.Click, lblE5.Click, lblE6.Click, lblE7.Click, lblF1.Click, lblF2.Click, lblF3.Click, lblF4.Click, lblF5.Click, lblF6.Click, lblF7.Click, lblG1.Click, lblG2.Click, lblG3.Click, lblG4.Click, lblG5.Click, lblG6.Click, lblG7.Click, lblH1.Click, lblH2.Click, lblH3.Click, lblH4.Click, lblH5.Click, lblH6.Click, lblH7.Click, lblI1.Click, lblI2.Click, lblI3.Click, lblI4.Click, lblI5.Click, lblI6.Click, lblI7.Click, lblJ1.Click, lblJ2.Click, lblJ3.Click, lblJ4.Click, lblJ5.Click, lblJ6.Click, lblJ7.Click, lblK1.Click, lblK2.Click, lblK3.Click, lblK4.Click, lblK5.Click, lblK6.Click, lblK7.Click, lblL1.Click, lblL2.Click, lblL3.Click, lblL4.Click, lblL5.Click, lblL6.Click, lblL7.Click
    ClickedBox = CType(sender, Label)
    If ClickedBox.BackColor = Color.DodgerBlue Then 'Checks if seat is free
        ClickedBox.BackColor = Color.LawnGreen 'Changes colour of seats clicked to green
        ClickedBox.ForeColor = Color.LawnGreen
        TotalNoOfSeats = TotalNoOfSeats + 1
        strSeats(intCounter3) = ClickedBox.Name
        intCounter3 = intCounter3 + 1
    Else
        MsgBox("This seat has already been booked")
    End If
End Sub

When the user clicks the 'Book Seats' button I have called a procedure that attempts to save the array of seat names to a text file. The following code is the procedure:

    Sub SaveSeats()
    Dim intloop As Integer
    FileWriter = New StreamWriter("Seats " + AddFilm.strFilms(1, intSelectedFilm) + ".txt")
    FileWriter.WriteLine(intCounter3)
    For intloop = 0 To intCounter3
        FileWriter.WriteLine(strSeats(intloop))
    Next
    FileWriter.Close()
End Sub

On the line that contains:

    FileWriter.WriteLine(strSeats(intloop))

I get the following error: "System.IndexOutOfRangeException was unhandled Message=Index was outside the bounds of the array." Any help is appreciated.


Edit : i have used this approach but now i have another problem:

The error containing: "ObjectDisposedException - Cannot write to a closed TextWriter." appears on the line:

 FileWriter.WriteLine(SeatList(intloop))

This is the procedure I am using now to Save the list to the text file:

Sub SaveSeats()
    Dim intloop As Integer
    FileWriter = New StreamWriter("Seats " + AddFilm.strFilms(1, intSelectedFilm) + ".txt")
    FileWriter.WriteLine(NoOfClickedSeats)
    For intloop = 1 To NoOfClickedSeats
        FileWriter.WriteLine(SeatList(intloop))
        FileWriter.Close()
    Next  
End Sub

Array indices are zero based, so you have to subtract 1 from intCounter3 :

For intloop As Int32 = 0 To intCounter3 - 1
    FileWriter.WriteLine(strSeats(intloop))
Next

Consider that intCounter3 is 1 (the array contains one element). You would try to access the second element with intCounter3(1) which causes the IndexOutOfRangeException .

By the way, you should choose more meaningful names than intCounter3 , otherwise it'll be soon difficult to understand your code for you or others.

Edit : another problem with code is that you are resizing the array without redim. You should use a List(Of String) instead which can be resized:

So instead of:

strSeats(intCounter3) = ClickedBox.Name 

Use a list instead and it's Add method:

Private SeatList As New ist(Of String)

Private Sub lblA1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles lblA1.Click, lblA2.Click, lblA3.Click, lblA4.Click, lblA5.Click, lblA6.Click, lblA7.Click, lblB1.Click, lblB2.Click, lblB3.Click, lblB4.Click, lblB5.Click, lblB6.Click, lblB7.Click, lblC1.Click, lblC2.Click, lblC3.Click, lblC4.Click, lblC5.Click, lblC6.Click, lblC7.Click, lblD1.Click, lblD2.Click, lblD3.Click, lblD4.Click, lblD5.Click, lblD6.Click, lblD7.Click, lblE1.Click, lblE2.Click, lblE3.Click, lblE4.Click, lblE5.Click, lblE6.Click, lblE7.Click, lblF1.Click, lblF2.Click, lblF3.Click, lblF4.Click, lblF5.Click, lblF6.Click, lblF7.Click, lblG1.Click, lblG2.Click, lblG3.Click, lblG4.Click, lblG5.Click, lblG6.Click, lblG7.Click, lblH1.Click, lblH2.Click, lblH3.Click, lblH4.Click, lblH5.Click, lblH6.Click, lblH7.Click, lblI1.Click, lblI2.Click, lblI3.Click, lblI4.Click, lblI5.Click, lblI6.Click, lblI7.Click, lblJ1.Click, lblJ2.Click, lblJ3.Click, lblJ4.Click, lblJ5.Click, lblJ6.Click, lblJ7.Click, lblK1.Click, lblK2.Click, lblK3.Click, lblK4.Click, lblK5.Click, lblK6.Click, lblK7.Click, lblL1.Click, lblL2.Click, lblL3.Click, lblL4.Click, lblL5.Click, lblL6.Click, lblL7.Click
    ClickedBox = CType(sender, Label)
    If ClickedBox.BackColor = Color.DodgerBlue Then 'Checks if seat is free
        ClickedBox.BackColor = Color.LawnGreen 'Changes colour of seats clicked to green
        ClickedBox.ForeColor = Color.LawnGreen
        TotalNoOfSeats = TotalNoOfSeats + 1
        SeatList.Add(ClickedBox.Name)
        intCounter3 = intCounter3 + 1
    Else
        MsgBox("This seat has already been booked")
    End If
End Sub

Edit : according to your last edit related to the ObjectDisposedException :

You cannot close the writer in the loop since a closed writer cannot be used anymore. So you should close it after the loop.

For intloop = 0 To NoOfClickedSeats - 1
    FileWriter.WriteLine(SeatList(intloop))
Next  
FileWriter.Close()

or use the Using -statement which also ensures that it gets closed/disposed in case of an error:

Using FileWriter = New StreamWriter("Seats " + AddFilm.strFilms(1, intSelectedFilm) + ".txt")
    For intloop = 0 To NoOfClickedSeats - 1
        FileWriter.WriteLine(SeatList(intloop))
    Next 
End Using

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM