2012-02-24 11 views
6

Potrzebuję zaznaczyć i odznaczyć wszystkie elementy w kontrolerze VB.NET CheckedListBox, jaki jest najlepszy sposób na zrobienie tego?Jak sprawdzić lub odznaczyć wszystkie elementy w kontrolerze VB.NET CheckedListBox

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

     With clbCheckedListBox 

     .Items.Add("Select/UnSelect All") 
     .Items.Add("Enero") 
     .Items.Add("Febrero") 
     .Items.Add("Marzo") 
     .Items.Add("Abril") 
     .Items.Add("Mayo") 
     .Items.Add("Junio") 
     .Items.Add("Julio") 
     .Items.Add("Agosto") 
     .Items.Add("Septiembre") 
     .Items.Add("Octubre") 
     .Items.Add("Noviembre") 
     .Items.Add("Diciembre") 

     .SelectedIndex = 0 

    End With 


End Sub 


    Private Sub clbCheckedListBox_ItemCheck(sender As Object, e As System.Windows.Forms.ItemCheckEventArgs) Handles clbCheckedListBox.ItemCheck 

    If e.Index = 0 Then 

     If e.NewValue = CheckState.Checked Then 

      For idx As Integer = 1 To Me.clbCheckedListBox.Items.Count - 1 
       Me.clbCheckedListBox.SetItemCheckState(idx, CheckState.Checked) 
      Next 

     ElseIf e.NewValue = CheckState.Unchecked Then 

      For idx As Integer = 1 To Me.clbCheckedListBox.Items.Count - 1 
       Me.clbCheckedListBox.SetItemCheckState(idx, CheckState.Unchecked) 
      Next 

     End If 

    End If 

End Sub 

Po godzinach powyższy kod działa dobrze dla mnie!

+0

Proszę oznaczyć odpowiednią odpowiedź. –

Odpowiedz

3

Ricardo, może to może być to, czego szukasz:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 
    Dim items$() = New String() {"Select/UnSelect All", "Enero", 
    "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", 
    "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"} 
    For Each Str As String In items : clbCheckedListBox.Items.Add(Str) : Next 
End Sub ' Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) 

Private Sub clbCheckedListBox_ItemCheck(sender As System.Object, e As System.Windows.Forms.ItemCheckEventArgs) Handles clbCheckedListBox.ItemCheck 
    If e.Index = 0 Then 
     Dim newCheckedState As CheckState = e.NewValue 
     For idx As Integer = 1 To clbCheckedListBox.Items.Count - 1 
      Me.clbCheckedListBox.SetItemCheckState(idx, newCheckedState) 
     Next 
    End If 
End Sub 
+0

Wiem, że jest to zaznaczone jako odpowiedź, ale zaczynasz od indeksu 1 i SetItemCheckState nie będzie działał w żadnym kodzie, w którym kiedykolwiek pracowałem, działa tylko SetItemChecked. – Keith

+0

@Keith: tak, celowo pomija pierwszy element, ponieważ pierwszym elementem jest "Wybierz/Anuluj wszystkie". – Edward

+0

Przetestowałem ten kod, zanim go opublikowałem. więc wiem, że kod pracował dla mnie. Keith, czy SetItemCheckState nie działa dla ciebie w WinForms czy WPF? Użyłem projektu WinForm. użyłem VS 2010, ponieważ moim zdaniem późniejsze VS 2012 i 2013 były obniżone. ale nie sądzę, że wersja VS ma znaczenie. Wiem, że użyłem środowiska .NET 4 (myślę .NET 4.5). czasami ma to związek z dziwactwami MS. może u chcesz porównać środowisko, które nie działa z SetItemCheckState do mojego środowiska. – Edward

14

Czy masz na myśli coś takiego:

Dim checked As Boolean = True ' Set to True or False, as required. 
For i As Integer = 0 To CheckedListBox1.Items.Count - 1 
    CheckedListBox1.SetItemChecked(i, checked) 
Next 

Tutaj jestem po prostu pętli przez wszystkie elementy CheckedListBox i ustawiania ich sprawdzenia stanu.

1
To check all CheckedListBox Item: 

For i As Integer = 0 To CheckedListBox1.Items.Count - 1 
    CheckedListBox1.SetItemChecked(i, True) 
Next 

To uncheck all CheckedListBox Item: 

For i As Integer = 0 To CheckedListBox1.Items.Count - 1 
    CheckedListBox1.SetItemChecked(i, false) 
Next 
4
If button.Text = "Select All" Then 
    For i As Integer = 0 To checklist.Items.Count - 1 
     checklist.SetItemChecked(i, True) 
    Next 
    Button.Text = "Deselect All" 
Else 
    For i As Integer = 0 To checklist.Items.Count - 1 
     checklist.SetItemChecked(i, False) 
     Button.Text = "Select All" 
    Next 
End If 
0

Dodany osobny checkbox nazywane "Zaznacz wszystko". Po zaznaczeniu i odznaczeniu tej pozycji można wybrać lub odznaczić checkbox. Tak można nazwać tę funkcję Kb() nigdzie w kodzie:

Private Sub ChkSelectAll_Click(sender As Object, e As EventArgs) Handles ChkSelectAll.Click 
    Kb(ChkSelectAll.CheckState) 
End Sub 

Private Sub Kb(ByVal Key As Boolean) 
    For i As Integer = 0 To ChkLstServices.Items.Count - 1 
     ChkLstServices.SetItemChecked(i, Key) 
    Next 
End Sub 
0

umieścić ten kod w SelectedValueChanged wydarzenie.

Private Sub clbCheckedListBox_SelectedValueChanged(sender As Object, e As System.EventArgs) Handles ContrListCheckBox.SelectedValueChanged 
    If clbCheckedListBox.SelectedIndex = 0 Then 
     If clbCheckedListBox.GetItemChecked(0) = False Then 
      For idx As Integer = 1 To clbCheckedListBox.Items.Count - 1 

       Me.clbCheckedListBox.SetItemChecked(idx, False) 
      Next 
     Else 
      For idx As Integer = 1 To ContrListCheckBox.Items.Count - 1 

       Me.clbCheckedListBox.SetItemChecked(idx, True) 
      Next 
     End If 
    ElseIf clbCheckedListBox.SelectedIndex > 0 Then 
     If clbCheckedListBox.CheckedItems.Count = clbCheckedListBox.Items.Count - 1 And clbCheckedListBox.GetItemChecked(0) = False Then 
      clbCheckedListBox.SetItemCheckState(0, CheckState.Checked) 
     End If 
     For idx As Integer = 1 To clbCheckedListBox.Items.Count - 1 

      If clbCheckedListBox.GetItemChecked(idx) = False Then 
       clbCheckedListBox.SetItemCheckState(0, CheckState.Unchecked) 

      End If 
     Next 
    End If 
End Sub 

Inne rozwiązania są poprawne, ale jeśli chcesz, aby usunąć zaznaczenie innego wyboru wewnątrz CheckBoxList lub opróżnić CheckBoxList bez Select All wyboru górna pole pozostanie sprawdzane i to nie jest logiczne więc powyższy kod powinien rozwiązać ten problem .

1

Znalazłem, że clbCheckedListBox.clearSelection() działa dobrze dla odznaczenia wszystkich.

+0

Witaj w SO Trey :-). Generalnie nie jest świetnym pomysłem dodawanie do pytań, które są tak stare i już mają akceptowaną odpowiedź. Co więcej, zachęca się odpowiedzi do pisania więcej niż jednej linii - w przeciwnym razie komentarz byłby lepszy. Na koniec spróbuj poprawnie sformatować składki, ponieważ pomaga to w czytelności; w tym przypadku kod może być sformatowany (będę kontynuować i edytuję, żebyś wiedział co mam na myśli). – Toby

+0

@Trey Masz na myśli '.ClearSelected()'? Moje VisualStudio 2017 z .NET Framework 4.5 nie akceptuje twoich sugestii. I tylko dla zapisów: To NIE odznacza pozycji, po prostu odznacz je. – PeterCo

Powiązane problemy