Comboitem Index finden

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von JLH.

    Comboitem Index finden

    Ich möchte einen bestimmten Eintrag in einer ComboBox selectieren.
    Die Combobox wird zur Laufzeit mit möglichen Werten gefüllt. Einer dieser Werte wird als Default gesetzt und ich möchte diesen in der Combobox selectieren. Dazu habe ich folgende Zeilen:

    VB.NET-Quellcode

    1. For Each comboitem In FrmMain.cboKombi.Items
    2. If comboitem = KombiTlg Then
    3. FrmMain.cboKombi.SelectedIndex = Z
    4. End If
    5. Z += 1
    6. Next comboitem


    Ich zähle den Index über Z mit, das ist nicht sehr elegant. Wo finde ich den aktuellen Index wenn "ComboItem = KombiTlg"?
    Gibt es die Items nur in der ComboBox? Besser wäre in einer List(Of String) und DataBinding, dann könntest Du mit DeineListOfString.IndexOf(KombiTlg) arbeiten.
    Notfalls eben: cboKombi.Items.Cast(Of String).ToList.IndexOf(KombiTlg)
    Wie wird verhindert, dass ein Element mehrfach in der Auflistung auftauchen kann?
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Die Items sind Werte in einer Tabelle fest hinterlegt und kommen nur einmal vor. Einer festen aber beliebigen Länge wird ein zusammenhängender Bereich dieser Werte zugeordnet. Der User hat also die Wahl zwischen Min und Max. Irgendeiner dieser Werte wurde durch eine Routine als Default festgelegt. Der User kann also über die Combobox einer der anderen möglichen Werte wählen und es wird neu berechnet. Es soll aber der Default in der Combobox zu Beginn angewählt sein.

    Zählt da nichts mit bei dem "For each..."? Hat das aktuelle comboitem kein Index?
    Nein, ein ForEach zählt nicht. Wenn Du nur die Schleife einfacher machen willst, nimm eine klassische For-Schleife, also For i = 0 To cboKombi.Items.Count - 1.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    :huh:
    If FrmMain.cboKombi(i).ToString = KombiTlg Then
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @Haudruferzappeltnoch Stell Dir vor es handelt sich um Schrauben. Es gibt die zb von M1 bis M30. Der User gibt eine Belastung ein und der User bekommt für diese als Auswahl M10 angezeigt. Er kann aber auch gültige Schrauben von M6 bis M14 verwenden. Also wird in die Combo M6, M8, M10, M12 und M14 eingtragen. Wählt er etwas anderes als M10 berechnet das Programm zB die neue Bohrung für das Gewinde...

    @VaporiZed Dachte ich auch, klappt aber net
    Ich weiß ja nicht, was Du bisher hast, aber bei mir funktioniert es. Ich habe in der ComboBox "Foo", "Bar" und "Baz":

    VB.NET-Quellcode

    1. Friend Class FrmMain
    2. Private Foo As New Foo
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Foo.Bar("Baz")
    5. End Sub
    6. End Class
    7. Friend Class Foo
    8. Sub Bar(KombiTlg As String)
    9. For i = 0 To FrmMain.cboKombi.Items.Count - 1
    10. If FrmMain.cboKombi.Items(i).ToString = KombiTlg Then FrmMain.cboKombi.SelectedIndex = i
    11. Next
    12. End Sub
    13. End Class

    Und damit wird "Baz" in der ComboBox ausgewählt. Also funktioniert der Code.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ist das i nicht Index genug? Aus dem cboKombi.Items(i) ergibt sich die Rolle des is als Zählindex innerhalb der ComboBoxItemAuflistung. Wenn es das nicht ist, was Du willst (obwohl sich mir der Sinn dann nicht erschließt), warum muss dann noch eine (andere) Art von Index mitlaufen? Der Code funktioniert ja offensichtlich. Also: Was willst Du warum ganz konkret anders haben? Eine ForEachLoop mit Zählindex ist 1. Pfeil-Rücken-Brust-Auge (denn ForEach wurde u.a. erschaffen, um eben keine Zählvariable mehr zu benötigen) und 2. hast Du es ja schon in Post#1, aber es passt Dir trotzdem nicht. So what?

    Statt einer Schleife kannst Du auch einfach nur schreiben: FrmMain.cboKombi.SelectedItem = KombiTlg. Aber leider ist da auch kein Zählindex mehr dabei.

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    JLH schrieb:

    Der User gibt eine Belastung ein und der User bekommt für diese als Auswahl M10 angezeigt. Er kann aber auch gültige Schrauben von M6 bis M14 verwenden. Also wird in die Combo M6, M8, M10, M12 und M14 eingtragen
    Dann hätte ich eine Methode der Art:
    Private Function GetToleratedScrews(belastung as Double) as List(Of Integer) Entweder kann man das der Combobox zuweisen oder es gibt vielleicht eine Schraubentabelle, wo man das noch detaillierter zuordnen mag. Etwa hat eine Schraube einen Belastungsbereich und darüber kann eine Auswahl getroffen werden.
    Wenn der Defaultwert in der Mitte liegt, kannst dir den Index ausrechnen: SelectedIndex = CInt((cboKombi.Items.Count - 1) / 2)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Haudruferzappeltnoch“ ()

    Hi
    For Each bzw. For/Next um ein Item in einer Combobox, bzw dessen Index, zu suchen ist keine schöne Variante. Die Combobox müsste doch selbst eine Möglichkeit bieten um einen String/Teilstring zu suchen und dessen Item-Index zurück zu geben. Alternativ per API SendMessage die Nachricht CB_FINDSTRING (findet das erste Item das einen Teilstring enthält) oder die Nachricht CB_FINDSTRINGEXACT (findet das Item das genau dem String entspricht) an die Combobox senden. Die Rückgabe von SendMessage, falls ein Item gefunden wird, ist der null basierte Index des Item. Die Nachricht CB_SELECTSTRING wäre auch eine Möglichkeit. Sucht nach einem String ab Index und wenn ein Item gefunden wird, wird dieses auch gleich selektiert.
    Mfg -Franky-

    -Franky- schrieb:

    Die Combobox müsste doch selbst eine Möglichkeit bieten um einen String/Teilstring zu suchen und dessen Item-Index zurück zu geben
    Das sehe ich anders. Controls sollen ja keine Daten speichern, warum sollte sie dann in Daten suchen können?
    Normalerweise knüpft man eine Liste an die Combobox oder aber die Items der Combobox bleiben konstant.
    In ersterem Fall hat die Liste die Funktion IndexOf. Im zweiteren Fall ist der Index zur Designzeit bekannt.

    Haudruferzappeltnoch schrieb:

    Das sehe ich anders. Controls sollen ja keine Daten speichern, warum sollte sie dann in Daten suchen können?

    Insofern richtig, falls es sich um ein virtuelles Control handelt. Dann befinden sich tatsächlich keine Items/Daten im Control. @petaod hat ja die entsprechende .NET Funktion heraus gesucht. Im Hintergrund passiert da aber auch nichts anderes wie ein SendMessage mit entsprechender Message.
    Mfg -Franky-
    also ich würde sowas mal wieder mit Databinding abfackeln.
    Die combo wird an eine BindingSource gehängt, und dann täte ich deren Filter so festlegen, dass alle Datensätze innerhalb des Bereichs angezeigt würden.
    Weiters täte ich via BindingSource.Position den gewünschten Default-Wert festlegen.

    im Control wird dabei überhaupt nix gelesen oder gesucht - und es würde ebenso funktionieren mit einer Listbox, oder einem Datagridview.
    @VaporiZed Wow! Das nenn ich jetzt mal eine Lösung. Eigentlich brech ich mir einen ab weil ich den richtigen Eintrag in der Combobox mit FrmMain.cboKombi.SelectedIndex = Z erst finden und dann selectieren möchte und dann geht es so einfach mit FrmMain.cboKombi.SelectedItem = KombiTlg. Genau sowas brauch ich. Danke!

    Mit dem Hinweis von Petaod sieht der Code den ich eigentlich gesucht habe so aus:

    VB.NET-Quellcode

    1. For Each comboitem In FrmMain.cboKombi.Items
    2. If comboitem = KombiTlg Then
    3. Z = FrmMain.cboKombi.FindString(KombiTlg)
    4. FrmMain.cboKombi.SelectedIndex = Z
    5. End If
    6. Next comboitem


    Ist aber wie ich jetzt weiß viel zu umständlich. Aber so findet man den gesuchten Index für all diejenigen die ihn auch mal suchen müßen.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „JLH“ ()