tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
480
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Bella_Isy Bella_Isy ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    114
    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 :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    
    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.
     
    Achtung******!! Diese Nachricht kommt von einer Frau.

  2. #2
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    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.
     

  3. #3
    Bella_Isy Bella_Isy ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    114
    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
     
    Achtung******!! Diese Nachricht kommt von einer Frau.

  4. #4
    Registriert seit
    Nov 2003
    Ort
    Bergen / Norway
    Beiträge
    309
    Dann lies doch die Kunden schon sortiert aus der Datenbank

    Code sql:
    1
    2
    
    SELECT Kundenname FROM Kunde WHERE ...
    ORDER BY Kundenname

    Greetz
     
    "Gott ist tot! Gott bleibt tot! Und wir haben ihn getötet." - Friedrich Nietzsche

  5. #5
    Bella_Isy Bella_Isy ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    114
    Zitat Zitat von Norbert Eder

    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
     
    Achtung******!! Diese Nachricht kommt von einer Frau.

  6. #6
    Bella_Isy Bella_Isy ist offline Mitglied Gold
    Registriert seit
    Mar 2005
    Beiträge
    114
    Zitat Zitat von LordDeath
    Dann lies doch die Kunden schon sortiert aus der Datenbank

    Code sql:
    1
    2
    
    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
     
    Achtung******!! Diese Nachricht kommt von einer Frau.

  7. #7
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    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
     

  8. #8
    Registriert seit
    Nov 2003
    Ort
    Bergen / Norway
    Beiträge
    309
    Sorry Bella_Isy ich hab es heute früh verpeilt, es war einfach noch zu Früh!

    Greetz
     
    "Gott ist tot! Gott bleibt tot! Und wir haben ihn getötet." - Friedrich Nietzsche

  9. #9
    Avatar von Norbert Eder
    Norbert Eder Norbert Eder ist offline Mitglied Diamant
    Registriert seit
    Feb 2004
    Ort
    Österreich / Graz
    Beiträge
    5.137
    Blog-Einträge
    51
    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.

    Code csharp:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    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.
     

Ähnliche Themen

  1. Rennspiel - Schnellere Zeiten möglich?
    Von String im Forum Flash Plattform
    Antworten: 7
    Letzter Beitrag: 15.07.09, 15:58
  2. Allgemeine Query-Frage: schnellere Variante
    Von sth_Weird im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 30.01.09, 13:21
  3. Schnellere Builds mit Multithreaded Compilation
    Von Thomas Darimont im Forum Java
    Antworten: 0
    Letzter Beitrag: 09.07.08, 22:55
  4. Schnellere Funktion mit ob_start(); ?
    Von Freakz91 im Forum PHP
    Antworten: 4
    Letzter Beitrag: 11.06.08, 16:20
  5. Antworten: 6
    Letzter Beitrag: 05.06.08, 12:47