Es ist keine sehr flexible Art zu programmieren wenn alle Werte explizit im Programmcode vorhanden sind. Du willst das Programm nicht umwandeln wenn etwa "Element 4" dazu kommt, oder?
Daher könntest du vielleicht besser eine Liste der Werte bereitstellen, und pro Liste eine Unterliste haben für die CheckBoxList Einträge (vielleicht kommt auch mal "Element 1.4"). Die Elemente solcher Listen kannst du als kleine Klassenobjekte definieren. Ein XmlSerializer kann dann die ganze Struktur speichern und wieder einlesen.
So die Theorie, hier ist ein Beispiel. Vielleicht begreifst du am Anfang nicht alles, aber weitere Fragen kannst du ruhig stellen.
Public Class Form1
Public Class ListItem
Public Property Name As String
Public Property SubItems As New List(Of SubItem)
Public Sub New()
End Sub
Public Sub New(ByVal name As String, ByVal subItems As List(Of SubItem))
Me.Name = name
Me.SubItems.AddRange(subItems)
End Sub
End Class
Public Class SubItem
Public Property Name As String
Public Property Selected As Boolean
Public Sub New()
End Sub
Public Sub New(ByVal name As String)
Me.Name = name
End Sub
Public Sub New(ByVal name As String, ByVal selected As Boolean)
Me.Name = name
Me.Selected = selected
End Sub
Public Overrides Function ToString() As String
Return Name
End Function
End Class
Public path As String = "C:\Test\clb.xml"
Public Items As List(Of ListItem)
Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As _
System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
Dim xs As New Xml.Serialization.XmlSerializer(Items.GetType())
Using strm As IO.Stream = IO.File.OpenWrite(path)
xs.Serialize(strm, Items)
End Using
End Sub
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
System.EventArgs) Handles MyBase.Load
If IO.File.Exists(path) Then
Dim xs As New Xml.Serialization.XmlSerializer(GetType(List(Of _
ListItem)))
Using strm As IO.Stream = IO.File.OpenRead(path)
Items = CType(xs.Deserialize(strm), List(Of ListItem))
End Using
Else
Items = New List(Of ListItem)
Dim sis As New List(Of SubItem)
sis.AddRange({New SubItem("Element 1.1"), New SubItem("Element" & _
"1.2"), New SubItem("Element 1.3")})
Dim li As New ListItem("Element 1", sis)
Items.Add(li)
sis.Clear()
sis.AddRange({New SubItem("Element 2.1"), New SubItem("Element" & _
"2.2"), New SubItem("Element 2.3")})
li = New ListItem("Element 2", sis)
Items.Add(li)
End If
ListBox1.DataSource = Items
ListBox1.DisplayMember = "Name"
End Sub
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As Object, ByVal e _
As System.EventArgs) Handles ListBox1.SelectedIndexChanged
CheckedListBox1.Items.Clear()
Dim pos As Integer
For Each si As SubItem In CType(ListBox1.SelectedItem, _
ListItem).SubItems
CheckedListBox1.Items.Add(si)
CheckedListBox1.SetItemChecked(pos, si.Selected)
pos += 1
Next
End Sub
Private Sub CheckedListBox1_ItemCheck(ByVal sender As Object, ByVal e As _
System.Windows.Forms.ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
If CheckedListBox1.SelectedItem Is Nothing Then Return
CType(CheckedListBox1.SelectedItem, SubItem).Selected = e.NewValue
End Sub
End Class ________
Alle Angaben ohne Gewähr. Keine Haftung für Vorschläge, Tipps oder sonstige Hilfe, falls es schiefgeht, nur Zeit verschwendet oder man sonst nicht zufrieden ist |