De Page_Load wordt altijd eerst uitgevoerd.
In die Page_Load zal je alle checkboxen clearen die nog niet in de databank stonden.
Dus wat niet in de databank stond wordt niet weggeschreven.
Je kan dat oplossen door te testen op IsPostBack (pagina wordt van de browser terug naar de dezelfde URL gestuurd, bijvoorbeeld omdat je op de add knop klikte).
Als je dat doet moet je het wegschrijven ook aanpassen (je mag enkel die checkboxen "wegschrijven" die enabled zijn (de andere staan al in de databank).
Dus zoiets:
Visual Basic Code:
Partial Class _Default
Inherits System.Web.UI.Page
' DEZE CODE WORDT ALTIJD UITGEVOERD VOOR DE ButtonAdd_Click !!
Protected Sub Page_Load(sender As Object, e As System.EventArgs) Handles Me.Load
' Ik maak de ListItems hier ook dynamisch aan, jij hebt dat niet denk ik, dus dat is even anders.
' Daarom zet ik dat ook even afzonderlijk, normaal zou ik het combineren met de code hier onder
If Not IsPostBack Then
For index = 1 To 150
CheckBoxListStoelen.Items.Add(New ListItem("", index.ToString))
Next
End If
' Enkel indien geen PostBack (dus indien niet op knop geklikt, bijvoorbeeld)
If Not IsPostBack Then
Dim lijst = GetStoelen()
For Each item As ListItem In CheckBoxListStoelen.Items
item.Selected = lijst.Contains(item.Value)
item.Enabled = Not item.Selected
Next
End If
End Sub
' DEZE CODE WORDT ALTIJD UITGEVOERD NA DE Page_Load
Protected Sub ButtonAdd_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
Const cmdText = "INSERT INTO Plaats (Stoelnummer) VALUES (@StoelNummer)"
Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
Using command As New SqlCommand(cmdText, connection)
command.Parameters.Add("StoelNummer", Data.SqlDbType.NVarChar)
connection.Open()
For Each item As ListItem In CheckBoxListStoelen.Items
' enkel wegschrijven indien geselecteerd EN enabled (dus nieuw)
If item.Selected AndAlso item.Enabled Then
command.Parameters(0).Value = item.Text
command.ExecuteNonQuery()
' deze is dus ook niet meer nieuw
item.Enabled = False
End If
Next
connection.Close()
End Using
End Using
End Sub
Private Function GetStoelen() As List(Of String)
Dim lijst As New List(Of String)
Const cmdText As String = "SELECT StoelNummer FROM Plaats"
Using connection As New SqlConnection(ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString)
Using command As New SqlCommand(cmdText, connection)
connection.Open()
Using reader = command.ExecuteReader
While reader.Read
lijst.Add(reader.GetString(0))
End While
End Using
connection.Close()
End Using
End Using
Return lijst
End Function
End Class
Dit gezegd: ik denk dat er intelligenter manieren te bedenken zijn dan met checkboxen om dit te verwezenlijken.