ComboBox Dropdown Suchen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von Luftpost.

    ComboBox Dropdown Suchen

    Guten Abend,

    ich sitze vor einer ComboBox die Ich als DropDown habe...
    In der ComboBox habe Ich Daten hinterlegt.

    Das Funktioniert auch...
    Wenn Ich nun das Programm starte und tippe in die Box hinein, soll er nach eingabe der Enter-Taste oder Tab-Taste den Wert übernehmen und mir in einer Separaten Textbox den Wert ausgeben zum Test.

    Allerdings scheitere Ich da :/

    Es soll ein Postleitzahlen Tool werden welches mir folgend Werte liefern soll:
    Postleitzahl
    Ort
    Bundesland
    TNA (Vorwahl)

    Dafür hab Ich auch eine CSV wo eben diese daten stehen, dass sind aber mehr als 10000 Datensätze :/

    Jetzt dachte Ich mir, ich lese die CSV aus, und hinterlege die Inhalte in

    VB.NET-Quellcode

    1. Dim plz() = {"99510", "99423", "99091", "01234"}
    2. Dim ort() = {"Apolda", "Weimar", "Erfurt", "Test"}
    3. Dim vWahl() = {"03644", "03643", "0361", "0123"}
    4. Dim bLand() = {"Thüringen", "Thüringen", "Thüringen", "Testland"}
    5. Dim zustand() = {"VKDG", "VKDG", "VKDG", "UnityMedia"}


    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim plz() = {"99510", "99423", "99091", "01234"}
    3. Dim ort() = {"Apolda", "Weimar", "Erfurt", "Test"}
    4. Dim vWahl() = {"03644", "03643", "0361", "0123"}
    5. Dim bLand() = {"Thüringen", "Thüringen", "Thüringen", "Testland"}
    6. Dim zustand() = {"VKDG", "VKDG", "VKDG", "UnityMedia"}
    7. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. ComboBox1.Items.Clear()
    9. ComboBox1.Items.AddRange(plz)
    10. End Sub
    11. Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged
    12. tb_ort.Text = ort(sender.selectedIndex)
    13. tb_bundesland.Text = bLand(sender.selectedIndex)
    14. tb_gehoert_zu.Text = zustand(sender.selectedIndex)
    15. tb_tna.Text = vWahl(sender.selectedIndex)
    16. End Sub
    17. End Class


    Kann mir hierbei einer unter die Arme greifen? :)

    Hier noch die XLS:
    plz_de.xls
    Guten Abend

    also ich habe dein Beispiel jetzt nicht direkt nachprogrammiert aber dein Ansatz erscheint mir nicht sonderlich praktikabel im Sinne der Objekt Orientierten Programmierung.

    Warum erzeugst du nicht eine Klasse mit den entsprechenden Properties und erstellst so deine Objekte?

    Danach könntest du eine i
    List of Objekte nehmen und diese dann an die Combobox binden (also im WPF) und im VB auf herkömmliche Art. So wäre es möglich über das durch die selektierte PLZ direkt das korrekte Objekt zu haben.

    Bzgl deiner Frage der Auswahl erledigt das die Combobox eigentlich alleine wenn du Texteingaben zulässt.
    mfG.
    Stephan
    Jo, das ist eine gelegentlich auftretende Standard-Anforderung: Auswahl aus einer sehr grossen Menge, und man will durch Tastendrücke die Auswahlmenge sukzessive einschränken, bis man am Ziel ist.
    Leider hat Microsoft da keine überzeugende Lösung für (was ich ziemlich schwach finde).
    Aber zum Glück gibts ja mich (bescheiden zu Boden blick) - also ich hab da mal was vorbereitet...
    AutoCompletion advanced

    Guck ma an, ob das vom Prinzip her deinen Anforderungen entspricht.
    Es wäre vielleicht auch folgendes möglich ohne Combobox (ich würde es so realisieren, weils schnell geht):
    Option a)
    ​Datagridview, welches leer ist. Obendrüber 4 TextBoxen, je für eine deiner Eigenschaften.
    ​Dem Datagridview weist du eine Bindingsource als Datasource zu, der Bindingsource die Datatable mit den Daten (weiter unten Code von mir fürs einlesen einer CSV als Datatable). Die Textboxinhalte übergibste der Bindingsource als Filter, den musst du dir allerdings dann zusammenfummeln.
    Ich würde in dem Fall erst Daten anzeigen lassen, wenn irgendeiner der Filter mehr als 2 Zeichen enthält.

    Option b)
    Nur Datagridview (gebunden an Tabelle, Tabelle kommt aus Code unten) mit Filterpopups: codeproject.com/Articles/33786/DataGridView-Filter-Popup
    ​Hat man die Filterpopups einmal verstanden (und debuggt), sind die super. Meine Nutzer lieben die mittlerweile.
    ​Leider musst du bei dieser Option erstmal alle Daten anbinden und hast somit 10000 Datensätze im DGV

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Shared Function GetDataTableFromCsv(Delimiter As Char) As DataTable
    2. ' "path">Pfad der CSV Datei
    3. ' "seperator">Zeichen mit dem die Spalten getrennt werden. Meist ';' oder ','
    4. Dim path As String
    5. Dim diaFile As New OpenFileDialog
    6. diaFile.InitialDirectory = "c:\desktop"
    7. diaFile.Filter = "CSV Dateien (*.csv)|*.CSV" '|Alle Dateien (*.*)|*.*"
    8. diaFile.FilterIndex = 1
    9. diaFile.Multiselect = False
    10. diaFile.RestoreDirectory = True
    11. If (diaFile.ShowDialog() = DialogResult.OK) Then
    12. path = diaFile.FileName
    13. Else
    14. Return Nothing
    15. End If
    16. Dim dt As New DataTable()
    17. Dim aFile As New FileStream(path, FileMode.Open)
    18. Using sr As New StreamReader(aFile, System.Text.Encoding.[Default])
    19. Dim strLine As String = sr.ReadLine()
    20. Dim bHasHeader As Boolean = False
    21. If MessageBox.Show("Erste Zeile enhält Spaltennamen?", "Header", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes Then
    22. bHasHeader = True
    23. End If
    24. Dim strArray As String() = strLine.Split(Delimiter)
    25. Dim columncounter As Integer = 1
    26. For Each value As String In strArray
    27. If bHasHeader = True Then
    28. dt.Columns.Add(value.Trim())
    29. Else
    30. dt.Columns.Add(columncounter.ToString)
    31. columncounter += 1
    32. End If
    33. Next
    34. Dim dr As DataRow = dt.NewRow()
    35. Dim bIsFirstNoHeader As Boolean = True
    36. While sr.Peek() > -1
    37. If bIsFirstNoHeader = True AndAlso bHasHeader = False Then
    38. strArray = strLine.Split(Delimiter)
    39. dt.Rows.Add(strArray)
    40. bIsFirstNoHeader = False
    41. Else
    42. strLine = sr.ReadLine()
    43. strArray = strLine.Split(Delimiter)
    44. dt.Rows.Add(strArray)
    45. End If
    46. End While
    47. End Using
    48. dt.TableName = path
    49. Return dt
    50. End Function
    Ich hab es auch versucht mal mit DB ACCESS...
    Allerdings wenn ich sie verwenden will... kommt immer Microsoft OLBDB oder sowads v12 wäre nicht installiert.
    Ich habe einen Win10 Pro Systemdrauf :/

    Deine variante hatte Ich bisher noch nicht probiert @Narretei
    Werd Ich aber in Angriff nehmen :)
    Hab mich dann entschieden auf das Data Source von VB zu versuchen.
    @ErfinderDesRades: Vielen Dank :)

    Allerdings scheitert es an der Access DB :(

    Habe Visual Studio 2017 Pro Version (Orig) :D
    Also keine gecrackte Version oder so :)
    Wenn du kein Access auf deinem PC installiert hast. Musst du die Access Database Engine installieren (kp ob das wirklich so heißt). Lässt sich bei MS kostenlos downloaden.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @mrMo
    ich habe Office365 installiert ;)
    Auch Original um zu vermeiden dass es nicht zu irgendwelchen sinn freien Fehlern kommt.
    Ich beschäftige mich viel zu selten damit, da Ich mehr in der PHP/MySQLi Sektion inne habe.

    Nun wurde aber nach einem PLZ-Tool gefragt welches auch Schachtausstieg signalisiert.
    Also wenn Postleitzahl in deren Zuständigkeit fehlt dann kann eine Planung organisiert werden ansonsten Absage.

    Aktuell wird es aber in x-verschiedenen Excel-Varianten verwendet und jeder nutzt eine andere aufgebaute Excel.
    Wir wollen es aber nun nach gefüllten 7 Jahren es aufs einheitliche bringen :)

    Erst war die Überlegung es als Webseiten-Tool zu machen.
    Das wiederum war aber nicht wünschenswert, so dass die Idee zum Programm-Tool kam. :)

    Hier mal ein Screen :)