Announcement

Collapse
No announcement yet.

CheckedListBox -> alle checked items in string mit Trennzeichen einlesen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • CheckedListBox -> alle checked items in string mit Trennzeichen einlesen

    Hallo Forum,

    jetzt bin ich ja schon ne Zeit dabei und dachte ich hätte den Dreh raus, da hänge ich wieder an einer banalen Anfängerfrage:

    Ich habe eine CheckedListBox und möchte die gecheckten Einträge in einen String einlesen damit ich den Inhalt dann in einer Datenbank speichern kann. Als Trennzeichen hätte ich gerne ein "," damit ich das später wieder (mittels split) zurückgeben kann.

    Beispiel Liste:
    Alex (checked)
    Georg
    Roger (checked)

    Ergebnis sollte sein: Dim string as String = "Alex,Roger"

    Mein Versuch:

    Code:
    For Each item As Object In CheckedListBox.CheckedItems
                    string = string & item.ToString() & ","          
    Next
    Debug.Print(string)
    'string = "Alex,Roger,"
    Das kommt der Sache schon am nächsten, allerdings stört natürlich das abschließende ",".
    Code:
    For Each item As Object In CheckedListBox.CheckedItems
                    neuerteil = neuerteil & item.ToString()
                    string = string& neuerteil
                    string = string.Insert(Len(neuerteil), ",")
    Next
    Debug.Print(Anlegenstring)
    'string ="Alex,Alex,Roger"
    'wenn aber Georg und Roger gechecked sind:
    'string = "Georg,Geor,gRoger"
    Das ist natürlich auch Krampf.

    Fazit: Ich checke das mit der String manipulation, -verkettung nicht.

    Danke für Hilfe! ;-)
    Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
    Entwicklungsumgebung: Visual Basic 2008 Pro

  • #2
    Da kann man sich am einfachsten wohl mit der string.Join Funktion behelfen.
    Aus den CheckedItems einfach ein String Array machen und durch string.Join jagen.

    [Highlight=C#]string[] strings = new string[checkedListBox1.CheckedItems.Count];
    checkedListBox1.CheckedItems.CopyTo(strings, 0);
    string concatenatedString = string.Join(",", strings);[/Highlight]

    Aus missionarischen Gründen in C#

    Comment


    • #3
      oh... wow... das ist mir auch neu. Also string.join

      Vielen Dank!!! man lernt nie aus

      Comment


      • #4
        Vielen Dank!

        Originally posted by Ralf Jansen View Post
        Da kann man sich am einfachsten wohl mit der string.Join Funktion behelfen.
        Aus den CheckedItems einfach ein String Array machen und durch string.Join jagen.

        [Highlight=C#]string[] strings = new string[checkedListBox1.CheckedItems.Count];
        checkedListBox1.CheckedItems.CopyTo(strings, 0);
        string concatenatedString = string.Join(",", strings);[/Highlight]

        Aus missionarischen Gründen in C#
        Ralf - geil!!! ;-) Ohne Schleife, da wäre ich nie drauf gekommen! Sieht sogar schön aus. Vielen Dank! Du hast mich wieder deutlich in die Anfängerecke zurückgeschoben... ;-)
        Die vb.net - Variante (aus Prinzip ):
        [highlight=vbnet]
        Dim stringarray(CheckedListBox1.CheckedItems.Count - 1) As String
        CheckedListBox1.CheckedItems.CopyTo(stringarray, 0)
        Dim ergebnis As String = String.Join(",", stringarray)
        [/highlight]
        Der Perfektion halber habe ich den Array noch "richtig" dimensioniert:
        Code:
        Dim stringarray(CheckedListBox1.CheckedItems.Count - 1) As String
        Mit join hatte ich schon experimentiert (kenne ich aus perl) aber eben nicht hinbekommen. Völlig neu ist mir das "CopyTo" - beeindruckend...

        Danke nochmal.
        Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
        Entwicklungsumgebung: Visual Basic 2008 Pro

        Comment


        • #5
          Hallo Alex,
          Originally posted by AlexMuc View Post
          Der Perfektion halber habe ich den Array noch "richtig" dimensioniert:
          Bist du sicher, dass das jetzt die richtige Dimension ist? (Ich kenne die VB-Syntax nicht, aber von den Überlegungen her zweifle ich daran: ) Items.Count ist die Anzahl der Elemente, also die Maximalzahl der ausgewählten Elemente. Das String-Array muss doch diese Maximalzahl enthalten und nicht den um 1 verringerten Wert, der (jedenfalls bei C#) für den maximalen Index steht?!

          Gruß Jürgen

          Comment


          • #6
            Originally posted by Jürgen Thomas View Post
            Hallo Alex,
            Bist du sicher, dass das jetzt die richtige Dimension ist? (Ich kenne die VB-Syntax nicht, aber von den Überlegungen her zweifle ich daran: ) Items.Count ist die Anzahl der Elemente, also die Maximalzahl der ausgewählten Elemente. Das String-Array muss doch diese Maximalzahl enthalten und nicht den um 1 verringerten Wert, der (jedenfalls bei C#) für den maximalen Index steht?!
            Gruß Jürgen
            Ähm, ich will den großen Meistern nicht wiedersprechen, aber in obigen Beispiel ergibt Count = 3 (wenn alle gechecked sind). 3 Elemente, welche mit copyto an den array übergeben werden. Also würde ein Array(3) dimensioniert. Nachdem Arrrayindizes doch grundsätzlich bei 0 zum zählen anfangen, hätte der Array damit also 4 (wie nennt man das?) Positionen (0-3) - benötigt werden doch aber nur 3 (0-2). Sprich Array(2).

            Ich wiederum habe von C# keine Ahnung, aber ich dachte die Indexregeln für Arrays sind irgendwie sprachenübergreifender Standard. In Perl z.B. haben wir auch bei 0 zum zählen angefangen...

            Bitte sagt jetzt nicht, dass ich auch sowas Grundsätzliches noch nicht verstanden habe... ;-)
            Zuletzt editiert von AlexMuc; 09.02.2010, 12:01.
            Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
            Entwicklungsumgebung: Visual Basic 2008 Pro

            Comment


            • #7
              Nachtrag...

              Wollte das jetzt doch wissen: 1. Googletreffer, Suchbegriff: C# arrray:

              Bei der Verwendung von Arrays gibt es einiges zu beachten:

              * Arrays sind Objekte und müssen instanziert werden
              * Die Arraygröße wird in eckige Klammern [] geschrieben
              * Gültige Werte für die Größe eines Arrays sind positive, ganzzahlige Zahlen
              * Der Arrayindex beginnt wie in C++ mit 0
              * Für ein Array der Größe n ist somit der Endindex (n-1)
              * Gültige Größen für Arrays sind (0, 1, 2, ...). Arrays mit Größe Null (0) sind leere Arrays.
              Beruhigt mich jetzt irgendwie... ;-)
              Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
              Entwicklungsumgebung: Visual Basic 2008 Pro

              Comment


              • #8
                Da steht wenn man ein Array der Länge 3 anlegt. z.B
                Code:
                new Array[3]
                dann enthält das Array 3 Elemente mit den Indizes 0-2 und nicht wenn ich deine Annahme richtig verstanden habe 4. Man übergibt an den Konstruktor die Anzahl der zur Verfügung zu stellenden Elemente und nicht den Wert des höchsten Indexes.

                Comment


                • #9
                  mittlerweile ist das wohl schon als off-topic zu bezeichnen... ;-)

                  Ihr treibt mir die Schamesröte ins Gesicht. Mein letzter (trotziger ) Versuch:
                  Aus: http://openbook.galileocomputing.de/...msvb020017.htm
                  2.18.1 Eindimensionale Arrays

                  Wird eine Variable von Typ String so deklariert:

                  Dim strName As String

                  so wird ein Array (oder Datenfeld) folgendermaßen deklariert:

                  Dim strJahreszeiten(3) As String

                  Die Vermutung ist korrekt: Die Zählung beginnt bei 0! Gefüllt wird das Datenfeld so:

                  strJahreszeiten(0) = "Frühling"
                  strJahreszeiten(1) = "Sommer"
                  strJahreszeiten(2) = "Herbst"
                  strJahreszeiten(3) = "Winter"
                  Dim strJahreszeiten(3) As String
                  Hier wird doch dem Konstruktor bei der Deklaration sehr wohl der höchste Index (3) und nicht die Anzahl der Elemente (4) übergeben.

                  Oder ist das tatsächlich ein Unterschied zwischen vb.net und c#?
                  Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
                  Entwicklungsumgebung: Visual Basic 2008 Pro

                  Comment


                  • #10
                    Hallo miteinander,

                    so lernen wir gemeinsam dazu:
                    Originally posted by AlexMuc View Post
                    Aus: http://openbook.galileocomputing.de/...msvb020017.htm
                    Hier wird doch dem Konstruktor bei der Deklaration sehr wohl der höchste Index (3) und nicht die Anzahl der Elemente (4) übergeben.

                    Oder ist das tatsächlich ein Unterschied zwischen vb.net und c#?
                    Wieso "oder"? Offensichtlich ist das ein gravierender Unterschied zwischen VB.NET und C#:
                    • VB.NET deklariert die Größe des Arrays durch die Obergrenze.
                    • C# deklariert die Größe durch die Angabe der Größe.

                    Die VB-Schreibweise habe ich genauso wie im OpenBook im wikibooks gefunden.

                    Gruß Jürgen

                    Comment


                    • #11
                      Wieso "oder"? Offensichtlich ist das ein gravierender Unterschied zwischen VB.NET und C#:
                      Wie dämlich Wer sich das wieder ausgedacht hat(wenn er gedacht hat).
                      Habe eine Assembly mit dem (ursprünglichen) c# Code mal durch den Reflector betrachtet.

                      Aus

                      [Highlight=C#] string[] strings = new string[this.checkedListBox1.CheckedItems.Count];[/Highlight]

                      wird.

                      [Highlight=VB.Net] Dim strings As String() = New String(Me.checkedListBox1.CheckedItems.Count - 1) {}[/Highlight]

                      Comment


                      • #12
                        CheckedListBox Event Handler feuert erst einen später

                        eigentlich ein neues problem, aber es hängt hiermit zusammen...

                        Und nein, ich habe nicht vor mir mein Programm von Euch schreiben zu lassen. ;-) Aber dennoch fühle ich mich nochmal genötigt (dumm) zu fragen:

                        Wir haben die Liste aus dem Anfangstopic.

                        Nun haben wir eine ComboBox deren Items sich aus den Inhalten der gecheckten Elemente der CheckedListBox zusammensetzen soll:

                        Mein Plan:
                        Code:
                        Private Sub CheckedListBox1_ItemCheck(ByVal sender As Object, ByVal e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
                        
                                Dim aktive(CheckedListBox1.CheckedItems.Count - 1) As String
                                CheckedListBox1.CheckedItems.CopyTo(aktive, 0)
                                ComboBox1.DataSource = aktive
                        
                        End Sub
                        Das geht auch (fast). Nur er feuert erst einen später. Soll heißen: markiere ich einen Eintrag in der CheckedListBox passiert gar nix. Markiere ich den zweiten, erscheint (nur) der erste als Item in der ComboBox.

                        Meines Erachtens sollte er jedoch mit diesem Code bei jedem einzelnen "Check" feuern und entsprechend (neu) befüllen. Auch ein me.refresh() hilft nix. Hat das irgendwie mit dem Focus zu tun? Oder wo liegt hier der Hund begraben?

                        Wie immer: Danke fürs mitdenken. ;-)
                        Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
                        Entwicklungsumgebung: Visual Basic 2008 Pro

                        Comment


                        • #13
                          Hallo Alex,

                          das ist ein Grund, warum ich auch Anfängern dringend empfehle, selbst in der SDK-Doku/MSDN/Hilfe zu blättern. Dort steht bei ItemCheck u.a. der Hinweis:
                          Der Aktivierungszustand wird erst nach Eintreten des ItemCheck-Ereignisses aktualisiert.
                          Also wird während des Ereignisses noch der alte Zustand festgestellt. Aber einen anderen Vorschlag habe ich auch nicht (es ist mir schleierhaft, warum es ItemChecked hier nicht gibt).

                          Gruß Jürgen

                          Comment


                          • #14
                            Originally posted by Jürgen Thomas View Post
                            Hallo Alex,
                            das ist ein Grund, warum ich auch Anfängern dringend empfehle, selbst in der SDK-Doku/MSDN/Hilfe zu blättern.
                            Hallo Jürgen,
                            habe ich wohl überlesen. Ich habe den Code für den Eventhandler da rauskopiert. Ich guck' da nähmlich, seit dem Du mich das erste Mal darauf auferksam gemacht hast!
                            Habe es nun so gelöst, dass die ComboBox erst durch den Erhalt des Focuses gefüllt wird. Das klappt.
                            [highlight=vbnet]
                            Private Sub ComboBox1_GotFocus(ByVal sender As Object, ByVal e As System.EventArgs) Handles ComboBox1.GotFocus
                            Dim aktiv(CheckedListBox1.CheckedItems.Count - 1) As String
                            CheckedListBox1.CheckedItems.CopyTo(aktiv, 0)
                            ComboBox1.DataSource = aktiv
                            End Sub
                            [/highlight]
                            Ich freue mich über Kommentare, Anmerkungen oder gar Verbesserungsvorschläge! ;-)
                            Entwicklungsumgebung: Visual Basic 2008 Pro

                            Comment

                            Working...
                            X