2010-11-19 5 views
0

Ich habe eine TreeView mit einem Elternknoten und zwei Kinderknoten. Jeder der Knoten enthält ein Kontrollkästchen, das in einem TreeViewItem gespeichert ist. Ich möchte, dass die Kontrollkästchen für die beiden untergeordneten Knoten auf IsChecked = true festgelegt werden, wenn der Benutzer den übergeordneten Knoten überprüft und die Kontrollkästchen für die beiden untergeordneten Knoten als IsChecked = false festgelegt werden sollen, wenn der Benutzer den übergeordneten Knoten deaktiviert.VB.NET WPF NullReference Ausnahme

Ich habe eine for-Schleife, in der die Kontrollkästchen des untergeordneten Knotens in einer Liste gespeichert sind. Das Kontrollkästchen Checkbox/Checkbox des Elternknotens Checkbox sollte die Checkliste der Child-Knoten durchlaufen, aber ich habe ein Problem mit der Liste. Aus irgendeinem Grund ist die Liste im Ereignis "Check-on/Uncheck" des übergeordneten Knotens gleich "nothing". Kann mir jemand erklären, wie ich auf diese Liste zugreifen soll?

hier mein Code:

Public Class Question 

Dim childCheckbox As CheckBox 
Dim childCheckboxes() As CheckBox 

Public Sub Window_Loaded(ByVal sender As System.Object, ByVal e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded 

    Dim parentCheckbox = New CheckBox 
    Dim parentNode = New TreeViewItem 

    parentCheckbox.Uid = "All Sites" 

    AddHandler parentCheckbox.Checked, AddressOf chkbox_AllChecked 
    AddHandler parentCheckbox.Unchecked, AddressOf chkbox_AllUnchecked 

    parentCheckbox.Content = "All Sites" 
    parentNode.Header = parentCheckbox 

    For Each osite In sites 

       Dim childNode = New TreeViewItem 
       Dim childCheckbox = New CheckBox 

       AddHandler childCheckbox.Checked, AddressOf chkbox_Checked 
       AddHandler childCheckbox.Unchecked, AddressOf chkbox_Unchecked 

       childCheckbox.Uid = osite.SiteName.ToString 

       childCheckbox.Content = osite.SiteName.ToString 
       childNode.Header = childCheckbox 
       parentNode.Items.Add(childNode) 

       'Add all childCheckbox to an array for use by parentChildbox methods to check/uncheck all 
       childCheckboxes(i) = childCheckbox 

       i += 1 

      Next 
      TreeView1.Items.Add(parentNode) 


    End Sub 

Private Sub chkbox_AllChecked(ByVal sender As Object, ByVal e As RoutedEventArgs) 
    Dim chk = DirectCast(sender, CheckBox) 

      'MessageBox.Show(chk.Uid.ToString) 


      'This part doesn't work. 
      For Each child In childCheckboxes 
       child.IsChecked = True 
      Next 

    End Sub 

Private Sub chkbox_Checked(ByVal sender As Object, ByVal e As RoutedEventArgs) 
    Dim chk = DirectCast(sender, CheckBox) 

      'MessageBox.Show("Check!") 
      MessageBox.Show(chk.Uid.ToString) 

End Sub 

Private Sub chkbox_Unchecked(ByVal sender As Object, ByVal e As RoutedEventArgs) 
    Dim chk = DirectCast(sender, CheckBox) 

      'MessageBox.Show("Uncheck!") 
      MessageBox.Show(chk.Uid.ToString) 

End Sub 

End Class 

Danke für die Hilfe!

Antwort

3

Könnten Sie versuchen, die Linie zu ändern:

Dim childCheckboxes() As CheckBox 

An:

Dim childCheckboxes as new list(of CheckBox) 
+0

Dank, dass die Nullreference Ausnahme gelöst, aber die childCheckboxes Liste ist noch leer, wenn ich versuche, es in der chkbox_AllChecked Methode zu verwenden, ... Irgendeine Idee, warum es dort leer ist? – zzMzz

+0

Anstatt die Listenelemente per Index zuzuweisen, verwenden Sie die Methode .Add(). –

Verwandte Themen