none
Problem mit der CheckedListBox RRS feed

  • Frage

  • Hallo liebes Forum!

    ich hätte eine Frage zu der "CheckedListBox". 

    Ist es möglich diese vorab so einzustellen, das nur ein Eintrag (Item) darin aktiv (checked) sein kann? Ich hoffe Ihr versteht, was ich meine.

    Da ich diese Einstellung lieder nicht gefunden habe, habe ich es versucht im Programm umzusetzen, jedoch nur mit mäßigem Erfolg:

    Dim ElmAktiv As Integer 
    Dim i As Integer = 0
    
    Do
    	ElmAktiv = i
    	i = i + 1
    Loop Until CheckedListBox1.GetItemChecked(i) = True Or i = CheckedListBox1.Items.Count - 1
    
    ElmAktiv = i
    
    While CheckedListBox1.CheckedItems.Count > 1
    	CheckedListBox1.SetItemChecked(ElmAktiv, False)
    End While

    Das ist natürlich nicht die einzige Variante die ich versucht habe, jedoch die "Beste" bis jetzt :(

    Ich hoffe Ihr könnt mir helfen und bedanke mich schon mal.

    Grüße,

    Tobias


    Freitag, 12. April 2013 14:32

Antworten

  • Hallo Tobias,

    ein Schnellschuß über das ItemCheck Ereignis:

        Private Sub CheckedListBox1_ItemCheck(sender As System.Object, e As System.Windows.Forms.ItemCheckEventArgs) _
            Handles CheckedListBox1.ItemCheck
            Dim clb = DirectCast(sender, CheckedListBox)
            If e.NewValue = CheckState.Checked Then
                ' Via Index und rückwärts, da Auflistung verändert wird
                Dim index = clb.CheckedIndices.Count - 1
                While index >= 0
                    ' Andere als den neu gewählte Index abwählen
                    If clb.CheckedIndices(index) <> e.Index Then
                        clb.SetItemCheckState(clb.CheckedIndices(index), CheckState.Unchecked)
                    End If
                    index = index - 1
                End While
            End If
        End Sub
    
    Gruß Elmar

    • Als Antwort markiert AtriuMiller Montag, 15. April 2013 14:18
    Freitag, 12. April 2013 17:06
  • Hallo Tobias,

    warum sollte das nicht gehen?

    Dim RadioItems As New List( Of String )
    Dim Counter    As Int32 = 0
    
        RadioItems.Add( "Abc" )
        RadioItems.Add( "Def" )
        RadioItems.Add( "Xyz" )
    
        For Each RadioItem As String In RadioItems
    
        Dim RadioButton As New RadioButton()
            RadioButton.Text = RadioItem
            RadioButton.Tag  = RadioItem
            RadioButton.Top  = Counter * 20
    
            GroupBox1.Controls.Add( RadioButton )
    
            Counter += 1
    
        Next
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert AtriuMiller Montag, 15. April 2013 13:28
    Montag, 15. April 2013 12:47
    Moderator

Alle Antworten

  • Hi,

    wenn Du RadioButtons willst, warum nimmst Du die dann nicht?

      http://msdn.microsoft.com/de-de/library/sefz7fxc.aspx

    CheckboxList ist eben dafür gedacht, mehrere Elemente selektieren zu können. RadioButtons dienen dazu, nur ein Element selektieren zu können.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 12. April 2013 14:39
    Moderator
  • Hallo Tobias,

    ein Schnellschuß über das ItemCheck Ereignis:

        Private Sub CheckedListBox1_ItemCheck(sender As System.Object, e As System.Windows.Forms.ItemCheckEventArgs) _
            Handles CheckedListBox1.ItemCheck
            Dim clb = DirectCast(sender, CheckedListBox)
            If e.NewValue = CheckState.Checked Then
                ' Via Index und rückwärts, da Auflistung verändert wird
                Dim index = clb.CheckedIndices.Count - 1
                While index >= 0
                    ' Andere als den neu gewählte Index abwählen
                    If clb.CheckedIndices(index) <> e.Index Then
                        clb.SetItemCheckState(clb.CheckedIndices(index), CheckState.Unchecked)
                    End If
                    index = index - 1
                End While
            End If
        End Sub
    
    Gruß Elmar

    • Als Antwort markiert AtriuMiller Montag, 15. April 2013 14:18
    Freitag, 12. April 2013 17:06
  • Hallo,

    danke erst mal für die Antworten ich werde beides sicherlich noch heute prüfen.

    RadioButtons habe ich auch schon in Betracht gezogen, doch man kann da ja leider keine Liste mit noch unbekannter Anzahl an Einträgen erzeugen lassen!? Oder? Wenn ja, dann währe das die perfekte Lösung. (Immerhin kennt man das ja, dass wenn das Auswahlelement rund ist, geht nur eine Auswahl; wenn das Auswahlelement eckig ist, gehen mehrere Optionen...)

    Danke soweit und beste Grüße,

    Tobias

    Montag, 15. April 2013 12:17
  • Hallo Tobias,

    warum sollte das nicht gehen?

    Dim RadioItems As New List( Of String )
    Dim Counter    As Int32 = 0
    
        RadioItems.Add( "Abc" )
        RadioItems.Add( "Def" )
        RadioItems.Add( "Xyz" )
    
        For Each RadioItem As String In RadioItems
    
        Dim RadioButton As New RadioButton()
            RadioButton.Text = RadioItem
            RadioButton.Tag  = RadioItem
            RadioButton.Top  = Counter * 20
    
            GroupBox1.Controls.Add( RadioButton )
    
            Counter += 1
    
        Next
    


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    • Als Antwort markiert AtriuMiller Montag, 15. April 2013 13:28
    Montag, 15. April 2013 12:47
    Moderator
  • Hallo Stefan,

    Danke für die Antwort! Das ist auf jeden Fall der Ansatz, den ich gesucht habe!

    Werde das so bei mir unterbringen.


    Grüße,

    Tobias



    Montag, 15. April 2013 13:27
  • Hallo,

    eine Sache wäre da noch. Ich hatte mich anfänglich für eine CheckedListBox entschieden, da hier eine Scrollbar angezeigt wird, sobald mehr Elemente enthalten sind als dargestellt werden. 

    Wenn ich nun die Variante mit den RadioButtons verwende, wird keine Scrollbar angezeigt. Diese wird weder bei der GroupBox, ListBox, Panel oder CheckedListBox angezeigt.

    Habe ich etwas übersehen? Gibt es eine Möglichkeit hier eine Scrollbar anzeigen zu lassen.

    Grüße,

    Tobias  

    Montag, 15. April 2013 14:10
  • Hab mir gerade mal die Lösung von Elmar angeschaut. Das scheint gut zu klappen!

    Sollte es keine Möglichkeit geben mit den RadioButtons eine Scrollbar einzufügen, werde ich die Lösung von Elmar benutzen.

    Danke Elmar!

    Grüße,

    Tobias 

    Montag, 15. April 2013 14:20
  • Hallo Tobias,

    nimm anstelle der GroupBox ein Panel Control, setze dessen AutoScroll Eigenschaft auf True, füg die RadioButtons dort ein und Voilà ... :)


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Montag, 15. April 2013 15:35
    Moderator
  • Hallo Tobias,

    es war wie gesagt ein Schnellschuss...

    Wenn man RadioButtons verwenden will, die logischer wären; wird es in der Summe aufwändiger. Wenn man ein Panel verwendet, kommt das eine oder andere zur Verwaltung hinzu.

    Als eine Alternative schau Dir mal an:
    http://www.codeproject.com/Articles/18526/RadioListBox-A-ListBox-with-Radio-Buttons-Winforms

    Gruß Elmar

    Montag, 15. April 2013 15:57
  • Hallo Elmar,

    nur aus Interesse: Was müsste man denn zusätzlich verwalten, wenn man ein Panel nimmt?

    Die Gruppierung funktioniert ja auch so (also dass innerhalb der RadioButtons in einem Panel die Auswahl immer nur auf einen RadioButton funktioniert und automatisch umgeschaltet wird).

    Den selektierten Wert muss man sich ja so oder so speichern, wenn die Auswahl geändert wird (oder man ermittelt den dann jeweils dort, wo man ihn benötigt).

    Sonst fällt mir da grad nix ein.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 15. April 2013 16:10
    Moderator
  • Hallo Stefan,

    das hängt ein bisschen von Ansprüchen ab.

    Wenn sollte ein Steuerelement wiederverwendbar sein. Eine Items Auflistung sollte alle Male da sein, zusammen mit Ereignissen usw.

    Und eine Unterstützung Datenbindung wäre ganz nett.

    Summa Summarum geschätzt ein paar Stündchen... vs 5 Minuten oben.

    Gruß Elmar


    • Bearbeitet Elmar Boye Montag, 15. April 2013 16:43
    Montag, 15. April 2013 16:42
  • Hallo Elmar,

    ach so. Klar, das ist natürlich 100%ig richtig. Soweit hab ich da nur grad nicht gedacht :) Danke für die Erleuchtung.


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Montag, 15. April 2013 17:06
    Moderator
  • Hallo Stefan,

    ich habe die Eigenschaft "AutoScroll" einfach übersehen.

    Danke!

    Dienstag, 16. April 2013 07:47