none
suchen in Combobox RRS feed

  • Frage

  • Hallo, 

    ich bin Neuling und versuche mich an einem kleinen Programm, welches Dateien in einer Combobox auflistet und öffnet. Nun versuche ich schon seit einer Weile die Combobox nach Suchbegriffen durchsuchen zu lassen. Autocomplete hilft mir leider nicht weiter, weil sie nur am Anfang anfängt zu suchen und meine Dateien mit einzelnen Buchstaben und Zahlen beginnen. Nun meine Frage: ist es möglich eine Volltextsuche in der Combobox zu integrieren, so das bei der Eingabe "Test" alle Dateien mit "Test" in der Autocompletevorschau erscheinen. Bsp.: A1.2.2 Test1.doc, B.3.1. Test3.xls. Ich hoffe, ich habe mich irgendwie verständlich ausgedrückt und Ihr könnt mir helfen!!!!! Danke im Vorraus!!!

    Hier mein Code zum laden und öffnen der Dateien

     Dim loPfade As New List(Of String)
    
        Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            loPfade.AddRange(IO.Directory.GetFiles("C:\Users\Test\", "*.*"))
            For Each item As String In loPfade
                ComboBox1.Items.Add(IO.Path.GetFileNameWithoutExtension(item)) 
            Next
        End Sub
    
     Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ComboBox1.SelectedIndexChanged
            Dim pr As Process = Process.Start(loPfade.Item(ComboBox1.SelectedIndex))
        End Sub

    Montag, 11. Februar 2013 09:41

Alle Antworten

  • Hallo,

    direkt in der ComboBox selbst zu filtern ist aufwändiger. Einfacher könnte für Dich sein,
    einen Filter über eine zusätzliche TextBox zu implementieren. Dann kannst Du die Datenbindung verwenden um eine gefilterte Menge (auf Basis von loPfade) anzuzeigen:

            Dim loPfade As New List(Of String)
            loPfade.AddRange(System.IO.Directory.GetFiles(
                Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "*.vb", SearchOption.AllDirectories))
    
            ' alle
            'Me.ComboBox1.DataSource = loPfade
    
            ' die in den Form enthalten ist
            Me.ComboBox1.DataSource = loPfade.Where(Function(name) name.Contains("Form")).ToList()
    

    Anstatt der Konstante "Form" kann man den Inhalt aus einer TextBox verwenden.

    Neben einfachen Filtern - wie oben Contains - könnte man mit regulären Ausdrücken über RegEx suchen; was allerdings Kenntnis von dessen Syntax beim Endanwender voraussetzt.

    Gruß Elmar

    Montag, 11. Februar 2013 10:38
    Beantworter
  • Hi Stan.

    So wie es aussieht, ist dafür (aus Kompatiblitätsgründen) keine Implementierung vorgesehen.

    Siehe: http://stackoverflow.com/questions/2111044/net-custom-search-on-combobox-auto-complete

    Für Webanwendungen hat sich offenbar mal jemand einen Workaround gebastelt über AJAX.

    http://blog.devarchive.net/2008/03/creating-custom-auto-complete-content.html

    Für Windows Forms habe ich allerdings auch nichts finden können.

    Vermutlich hilft nur hoffen, dass MS das noch implementiert (immerhin ist das ja im Web dank AJAX inzwischen üblich), oder selbst ein Control bauen (mit Textbox und Listbox müsste das ja irgendwie einigermaßen schnell zu machen sein).

    LG, Dennis.

    Montag, 11. Februar 2013 10:40
  • Hallo Elmar,

    Danke für die schnelle Antwort!!! Ich habe versucht mich in deinen Vorschlag rein zu lesen, musste aber leider feststellen das ich noch viel zu lernen habe!!! Vielleicht könntest du bitte mir noch mitteilen wie ich den TextBox Text als Variable nutzen kann??? Ich bin selbst daran gescheitert!!! Danke im Voraus!!!

    Gruß Stan


    • Bearbeitet Stan Br Montag, 11. Februar 2013 17:57
    Montag, 11. Februar 2013 17:40
  • Hallo Dennis,

    ich danke dir für die schnelle Antwort!!!

    LG Stan  


    • Bearbeitet Stan Br Montag, 11. Februar 2013 17:57
    Montag, 11. Februar 2013 17:41
  • Hallo Stan,

    dsa Beispiel von heute morgen ein klein wenig ergänzt:

        Dim loPfade As New List(Of String)
        Dim loPfadeFilter As String = ""
    
        Private Sub MainForm_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
            loPfade.AddRange(System.IO.Directory.GetFiles(
                Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "*.vb", SearchOption.AllDirectories))
    
            Me.ComboBox1.DataSource = loPfade
        End Sub
    
        Private Sub TextBox1_TextChanged(sender As System.Object, e As System.EventArgs) Handles TextBox1.TextChanged
            Dim textBoxControl = DirectCast(sender, TextBox)
    
            ' die in den Form enthalten ist
            Dim newFilter = textBoxControl.Text.Trim()
            If newFilter <> loPfadeFilter Then
                If Not String.IsNullOrEmpty(newFilter) Then
                    Me.ComboBox1.DataSource = loPfade.Where(Function(name) name.Contains(newFilter)).ToList()
                Else
                    Me.ComboBox1.DataSource = loPfade
                End If
                loPfadeFilter = newFilter
            End If
        End Sub
    

    Es gibt noch Raum für Verbesserungen, wie ein zeitverzögertes Filtern ... aber für den Anfang sollte es zeigen wie es gehen könnte.

    Zum Where siehe Erste Schritte mit LINQ in Visual Basic

    Gruß Elmar

    Montag, 11. Februar 2013 18:02
    Beantworter
  • Hallo Elmar,

    ich danke dir für deine super Unterstützung!!!

    Gruß Stan

    Dienstag, 12. Februar 2013 08:52
  • Hi Stan.

    Ich war mal so frei und habe auch noch etwas an meiner Idee herumgecoded. Ich habe die Gelegenheit genutzt, mein erstes Beispiel für die Galery zu erstellen. ;-)

    Habe eine eigene kleine Combobox gebastelt, die sich aus Textbox und Listbox zusammensetzt, und die die Autocomplete-Eigenschaft wie gewünscht erfüllt.

    http://code.msdn.microsoft.com/VB2010-ComboBox-with-AJAX-e52fd6ee

    Vielleicht auch eine Anregung für weiteres Basteln.

    LG, Dennis.

    Mittwoch, 13. Februar 2013 12:48
  • Hallo Dennis,

    ich habe mir Dein Code-Beispiel (bis jetzt) nicht näher angeschaut.
    Aber als Beispiel-Ausschnitt im Artikel würde ich (Abschnitte aus) ComboBoxWithAjaxlikeAutoComplete zeigen. Das dürfte Interessenten mehr ansprechen, als das hier belanglose Form_Load.

    Gruß Elmar

    Mittwoch, 13. Februar 2013 19:22
    Beantworter
  • Hallo Dennis,

    ich habe mir dein Projekt angeschaut und gleich etwas angepasst und ausprobiert, klappt super!!!!!! Ich habe nur eine Frage:  ich lade in deiner Combobox Dateien aus einem Verzeichnis,welche dann super suchen und finden - jedoch kann ich dann diese Datei nicht öffnen!!! Besteht irgendeine Möglichkeit die gefundene Datei zu öffnen??? Dank im Voraus!!!

    LG, Stan

    Freitag, 15. Februar 2013 08:47
  • Hallo ihr beiden.

    @Elmar. Okay, ich kann das ja noch anpassen.

    @Stan. Was genau meinst du mit "Möglichkeit die Datei zu öffnen"? Ich nehme mal an, du hast die gesuchte Datei ausgewählt in der Liste. Da die Basis ja eine Textbox ist, kannst du über ".text" auf den Inhalt zugreifen, und dann diesen Text weiterverwenden (zum Bleistift für einen StreamReader oder so). Und initiieren kannst du das z.B. über einen Button.

    So ähnlich würde man das ja auch mit einer normalen Combobox machen.

    LG, Dennis.

    Freitag, 15. Februar 2013 10:54
  • Hallo Dennis,

    wie du richtig bemerkt hast, wähle ich in der Liste die Datei aus. Das ist aber nur der Dateiname und nicht der komplette Pfad-wenn die Datei öffne, stellt sich eine Fehlermeldung dar. Unten stehender Code funktioniert, aber da muss ich auch den kompletten Pfad darstellen und genau das möchte ich nicht.

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim pr As Process = Process.Start(OwnComboBox1.Text)
        End Sub

    Der nun folgende Code funktioniert leider nicht-weißt du warum???

     Private Sub ComboBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OwnComboBox1.SelectedIndexChanged
            Dim pr As Process = Process.Start(loPfade19.Item(OwnComboBox1.SelectedIndex))
        End Sub
    LG Stan

    Freitag, 15. Februar 2013 14:06
  • Hi Stan.

    Vermutlich, weil du zum Verknüpfen von zwei Strings (also in dem Fall deinem loPfade19 und dem Dateinamen (Item(OwnComboBox1)....) das " & " als Operator brauchst, und nicht den Punkt.

    Achso ... nein Moment. Mir fällt gerade noch was auf: Ich habe bisher keinen selectedIndex implementiert. Zurück gibt es nur den Text (bisher). Weil es ja auch keine "richtige" ComboBox ist, sondern TextBox+ListBox(deren Inhalt sich permanent ändert und damit auch die Indizes).

    Nur eine Idee beim ersten überfliegen.

    Hth, Dennis.


    Freitag, 15. Februar 2013 16:06
  • Hallo Dennis,

    nö, geholfen hat es leider nicht, aber dein Projekt ist schon so ziemlich gut...

    Danke also nochmal und lG, Stan

    Montag, 18. Februar 2013 09:53