Fragensteller
suchen in Combobox

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
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
-
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.
-
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
-
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
-
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.
-
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
-
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
-
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.
-
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
-
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.
- Bearbeitet Dennis Becker Freitag, 15. Februar 2013 16:08