schnellere Suchfunktion!

Bella_Isy

Erfahrenes Mitglied
Hallo zusammen,

ich habe ein Problem mit einer Suchfunktion. Ich habe eine Suchefunktion geschrieben die Ihre Aufgabe auch einwandfrei erfüllt. Mein Problem ist nur, dass diese Suchfunktion sehr sehr langsam ist. Ich habe die Vermutung das meine For-Schleife das ganze einfach sehr langsam macht. Leider kenne ich keinen Weg dieses Geschwindigkeitsproblem zu lösen.
Vielleicht ist hier ja ein erfahrender Programmierer der mir helfen kann!

Hier einmal mein Code:
Code:
private void txtSucheEingabe_TextChanged(object sender, EventArgs e)
{
   if (this.txtSucheEingabe.Text != "")
   {
      //markierung mitwander lassen
      int maxindex = this.lstErgebnis.Items.Count;
      string text;

       for (int index = 0; index < maxindex; index++)
       {
          text = this.lstErgebnis.Items[index].ToString();
          if (text.Length < this.txtSucheEingabe.Text.Length)
          {
          }
          else
          {
            string help = text.Substring(0, this.txtSucheEingabe.Text.Length).ToUpper();
            if (help == this.txtSucheEingabe.Text.ToUpper())
            {
              int help2 = this.lstErgebnis.Items.IndexOf(this.lstErgebnis.Items[index]);
              this.lstErgebnis.SelectedIndex = help2;
              break;
            }
          }
       }
   }
}

Nun noch eine Beschreibung was diese Suchfunktion machen soll:

Ich habe auf einem Dialog eine Listbox (lstErgebnis). In dieser Listbox sind alle Kunden aufgeliestet. Die Kundennamen werden aus einer SQL Datenbank ausgelesen und in die Listbox geschrieben. Die Listbox ist soriert von A nach Z.
Auf dem Dialog gibt es jetzt noch ein Textfeld (txtSucheEingabe). Der Benutzer hat hier die möglichkeit der Sucheingabe. Der Fokus in der Listbox soll mit der Eingabe immer mitwander. Sprich wenn der Benutzer ein "M" eingibt soll der erste Kundenname mit "M" markiert werden. Wenn jetzt der Benutzer noch ein "E" eingibt (spriche im Textfeld steht jetzt "ME") soll der erste Kundenname mit "ME" markiert werden. So soll es immer weitergehn. Sollte mal keine Übereinstimmung gefunden werden, soll auch kein Kundenname markiert werden. Die Groß- und Kleinschreibung sollte dabei keine Rolle spielen.
 
Mit welchem Framework arbeitest du? Version 2.0? Wenn ja, ginge das einfacher:

AutoCompleteCustomSource setzen (zusätzlich zur normalen DataSource)
AutoCompleteMode auf Suggest stellen
AutoCompleteSource auf ListItems stellen

Fertig.

Unter 1.1 gehts glaub ich auch, ohne viel Sourcecode schreiben zu müssen, muss ich aber mal nachsehen, hab nur 2.0 im Moment hier.
 
Hallo,

ja ich arbeite mit dem neusten Framework 2.0. Ich werde es mal ausprobieren. Mal sehn ob es so funktioniert wie ich mir das vorstelle.

Danke Isabelle
 
Dann lies doch die Kunden schon sortiert aus der Datenbank

SQL:
Select Kundenname From Kunde Where ...
ORDER BY Kundenname

Greetz
 
Zuletzt bearbeitet von einem Moderator:
Norbert Eder hat gesagt.:
AutoCompleteCustomSource setzen (zusätzlich zur normalen DataSource)
AutoCompleteMode auf Suggest stellen
AutoCompleteSource auf ListItems stellen

Wenn ich die 3 Eigenschaften eingestellt habe, wie erreiche ich jetzt das die markierung mit der Eingabe mitwanderndert?

gruß Isabelle
 
LordDeath hat gesagt.:
Dann lies doch die Kunden schon sortiert aus der Datenbank

SQL:
Select Kundenname From Kunde Where ...
ORDER BY Kundenname

Greetz

Mit der Sortierung habe ich kein Problem. In meiner listbox werden die Werte sortiert angezeigt. Das was ich möchte ist, wenn der Benutzer in einem seperaten Textfeld eine Eingabe macht soll die Markierung im der Listbox mitwander, wenn was gefunden wird. Spriche gebe ich ein M ein geht die Markierung der listbox auf den ersten Eintrag der mit M beginnt.

Isabelle
 
Zuletzt bearbeitet von einem Moderator:
Aaaaaaaaaaaasoooooooo. Ich hab dich falsch verstanden. Ich dachte, du willst ein AutoComplete-Feature in der ComboBox. Sorry.

Aber, eventuell könnte man das kombinieren. Was ist, wenn du die von mir beschrieben 3 Punkte machst und einfach nur den in der Textbox eingegebenen Wert in die ComboBox überträgst? Ich kann es leider jetzt nicht testen, denn diesmal hab ich nur 1.1 installiert :)
 
So, nachdem ich so ziemlich alles falsch gelesen hab und missverstanden hab, hier eine Lösung für dich.

Das was du machst (und das ist unnötig): Du suchst _immer_ von Anfang an. Einfach den letzten Index merken der markiert wurde und bei einer Änderung des Textes von dort weitersuchen.

C#:
int lastindex = 0;
private void txtSucheEingabe_TextChanged(object sender, EventArgs e)
{
   if (this.txtSucheEingabe.Text != "")
   {
      //markierung mitwander lassen
      int maxindex = this.lstErgebnis.Items.Count;
      string text;

       for (int index = lastindex; index < maxindex; index++)
       {
          text = this.lstErgebnis.Items[index].ToString();
          if (text.Length > this.txtSucheEingabe.Text.Length)
          {
            string help = text.Substring(0, this.txtSucheEingabe.Text.Length).ToUpper();
            if (help == this.txtSucheEingabe.Text.ToUpper())
            {
              int help2 = this.lstErgebnis.Items.IndexOf(this.lstErgebnis.Items[index]);
              this.lstErgebnis.SelectedIndex = help2;
              break;
            }
          }
       }
   }
}
Damit bist du um einiges schneller. Das einzige was du noch einbauen musst ist, dass lastindex wieder auf 0 gestellt wird, wenn der Text in der Textbox zurückgesetzt wird.

Zusatz
Wird ein Zeichen gelöscht, musst du in die entgegengesetzte Richtung suchen. Das musst noch einbauen.
 

Neue Beiträge

Zurück