[VB] SelectionMode

Online-Skater

Erfahrenes Mitglied
Hallo Tutorianer,

bin noch ein Neuling in Sachen VB und daher gleich meine erste Frage. Ich arbeite ein Tutorial durch und nun habe ich ein Problem das ich selbst mit Debugger nicht verstehe.
Habe eine ListBox und eine ComboBox, nun möchte ich in der ComboBox die Art der Selection ansteuern (Einzelauswahl, Mehrfach mit STRG, Mehrfach ohne STRG)

Visual Basic:
    Private Sub frmSüßigkeiten_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With lstListe.Items
            .Add("Hanuta")
            .Add("Gummibärchen")
            .Add("Kinderschokolade")
            .Add("Duplo")
            .Add("Mars")
            .Add("Lutscher")
        End With
        cboAuswahl.Items.Add("Einzelauswahl")
        cboAuswahl.Items.Add("Mehrfachauswahl mit Strg/Shift")
        cboAuswahl.Items.Add("Mehrfachauswahl ohne Strg/Shift")
        cboAuswahl.SelectedIndex = 0
    End Sub

    'TODO Fehlerbehebung
    Private Sub cboAuswahl_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboAuswahl.SelectedIndexChanged
        Select Case lstListe.SelectedIndex
            Case 0
                Me.lstListe.SelectionMode = Windows.Forms.SelectionMode.One
            Case 1
                Me.lstListe.SelectionMode = Windows.Forms.SelectionMode.MultiExtended
            Case 2
                Me.lstListe.SelectionMode = Windows.Forms.SelectionMode.MultiSimple
        End Select
    End Sub

Die Auswertung mit Debugger ergibt das SelectedIndex immer -1 ist ! Aber manchmal funktioniert der Code aber nur ganz selten...
Ich kann mir nicht erklären warum -1 und warum sich der Index nicht ändert wenn ich die Option auswähle.

Ist es normal das sämtliche Ereignisse schon ausgelöst wird wenn das Fenster erstellt wird also vom Compiler ?

Danke für Anregungen ;-)
 
Zuletzt bearbeitet:
Hallo

Zu 1
Visual Basic:
    Private Sub cboAuswahl_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles cboAuswahl.SelectedIndexChanged
        ' Select Case lstListe.SelectedIndex  <------ Hier ist der Fehler
        Select Case Me.cboAuswahl.SelectedIndex
            Case 0
                Me.lstListe.SelectionMode = Windows.Forms.SelectionMode.One
            Case 1
                Me.lstListe.SelectionMode = Windows.Forms.SelectionMode.MultiExtended
            Case 2
                Me.lstListe.SelectionMode = Windows.Forms.SelectionMode.MultiSimple
        End Select
    End Sub
Zu 2
Die ComboBox ist ja leer.
Beim Laden der Form wird sie gefüllt und dadurch wird der 1. Eintrag aktiv.
Dadurch ändert sich der SelectedIndex der ComboBox.
 
Zu 2.) Na klar ohje bin ich fertig :)

Zu 1.) Danke habs dazu geschrieben, ist wichtig weil man mit mehreren Fenstern arbeitet wa ? Leider ist das Verhalten immer noch sehr merkwürdig, vielleicht liegt es auch an einer anderen Stelle ich poste mal den kompletten Code.

Visual Basic:
Public Class frmSüßigkeiten

    Private Sub frmSüßigkeiten_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        With lstListe.Items
            .Add("Hanuta")
            .Add("Gummibärchen")
            .Add("Kinderschokolade")
            .Add("Duplo")
            .Add("Mars")
            .Add("Lutscher")
        End With
        cboAuswahl.Items.Add("Einzelauswahl")
        cboAuswahl.Items.Add("Mehrfachauswahl mit Strg/Shift")
        cboAuswahl.Items.Add("Mehrfachauswahl ohne Strg/Shift")
        cboAuswahl.SelectedIndex = 0
    End Sub

    Private Sub butOk_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butOk.Click
        If lstListe.SelectedIndex = -1 Then
            MessageBox.Show("Bitte etwas auswählen !")
        Else
            Dim lstElement As Object
            Dim strInhalt As String
            ' For each Schleife
            For Each lstElement In lstListe.SelectedItems
                strInhalt &= Chr(13) & CType(lstElement, String) ' Object nach String umwandeln
            Next
            MessageBox.Show("Sie haben folgende Auswahl getroffen:" & Chr(13) & strInhalt)
        End If
    End Sub

    Private Sub butAbbrechen_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butAbbrechen.Click
        Me.Close()
        frmStart.Visible = True
    End Sub

    Private Sub butDelete_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butDelete.Click
        If lstListe.SelectedIndex = -1 Then
            MessageBox.Show("Bitte etwas auswählen !")
        Else
            lstListe.Items.Remove(lstListe.Items(lstListe.SelectedIndex))
        End If
    End Sub

    Private Sub butDeleteAll_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butDeleteAll.Click
        lstListe.Items.Clear()
    End Sub

    Private Sub butFill_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles butFill.Click
        lstListe.Items.Add("Überraschungsei " & lstListe.Items.Count.ToString)
    End Sub

    Private Sub btntop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btntop.Click
        Dim intPos As Integer = lstListe.SelectedIndex
        Dim objEintrag As Object = lstListe.SelectedItem
        lstListe.Items.Remove(objEintrag)
        lstListe.Items.Insert(intPos - 1, objEintrag)
    End Sub

    Private Sub btnbottom_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnbottom.Click
        Dim intPos As Integer = lstListe.SelectedIndex
        Dim objEintrag As Object = lstListe.SelectedItem
        lstListe.Items.Remove(objEintrag)
        lstListe.Items.Insert(intPos + 1, objEintrag)
    End Sub

    Private Sub lstListe_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles lstListe.SelectedIndexChanged
        If lstListe.SelectedItems.Count > 0 Then
            If lstListe.SelectedItems.IndexOf(lstListe.SelectedItem) = 0 Then
                btntop.Enabled = False
            Else
                btntop.Enabled = True
            End If
            Dim lastPos As Integer
            lastPos = lstListe.Items.IndexOf(lstListe.SelectedItems(lstListe.SelectedItems.Count - 1))
            If lastPos = lstListe.Items.Count - 1 Then
                btnbottom.Enabled = False
            Else
                btnbottom.Enabled = True
            End If
        End If
    End Sub
    'TODO Fehlerbehebung
    Private Sub cboAuswahl_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboAuswahl.SelectedIndexChanged
        Select Case Me.lstListe.SelectedIndex
            Case 0
                Me.lstListe.SelectionMode = Windows.Forms.SelectionMode.One
            Case 1
                Me.lstListe.SelectionMode = Windows.Forms.SelectionMode.MultiExtended
            Case 2
                Me.lstListe.SelectionMode = Windows.Forms.SelectionMode.MultiSimple
        End Select
    End Sub

End Class

Bei der SelectionMode.MultiSimple kann ich manchmal markieren durch ziehen (linke Maustaste gedrückt und über alle Elemente ziehen), aber es soll ja durch klicken ausgewählt werden also sehr merkwürdig die Geschichte. Beim Debuggen kommt immer -1 aber selten klappt Case 1 und Case 2. Dagegen funktioniert die Einzelauswahl immer auch wenn der Index -1 ist...:rolleyes:

mfg
 
Der Fehler ist ja immer noch drin
Code:
    Private Sub cboAuswahl_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cboAuswahl.SelectedIndexChanged
' ersetze:
        Select Case Me.lstListe.SelectedIndex
' mit:
        Select Case Me.cboAuswahl.SelectedIndex
 

Neue Beiträge

Zurück