Announcement

Collapse
No announcement yet.

Datensatz über Eingabefeld suchen ?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Datensatz über Eingabefeld suchen ?

    Hallo,

    ich habe ein kleines Problem.
    In einem Listenformular stelle ich neben Detaildaten eine Liste mit den Nach- und Vornamen unserer Mitarbeiter dar.
    Über ein Eingabefeld möchte ich, wenn man z.B. nur die ersten drei Anfangsbuchstaben des Namens eingibt, egal ob groß oder klein, der nächst mögliche Mitarbeiter selektiert wird, ohne das die gesamte Datenliste gefiltert wird.
    Natürlich haben wir nicht soviel Mitarbeiter das diese Funktion in diesem Zusammenhang einen Sinn macht, aber ich möchte eine ähnliche Selektierung auch bei unseren Kunden und Kontaktdaten anfügen. und somit die Einheitlichkeit der Formulare aufrechterhalten.

    System: VS2005, SQL2005, c#

    Momentan lasse ich die Datensätze mit einer for-schleife durchlaufen

    if (textBox1.Text != "")
    {
    DataRowView r;
    bsPersonal.MoveFirst();
    for (int i = 0; i < bsPersonal.Count; i++)
    {
    r = bsPersonal.Current
    asDataRowView;
    string nachname = r["nachname"].ToString().ToUpper();
    if (nachname.IndexOf(textBox1.Text.ToUpper()) != -1)
    {
    break;
    }
    bsPersonal.MoveNext();
    }
    }


    vielleicht hat ja jemand von euch eine elegantere Lösung parat. Ich denke bei mehreren hundert Datensätzen könnte dieser Vorgang einige Zeit in Anspruch nehmen.

    cu Jan
    Zuletzt editiert von Jan Kaiser; 18.02.2007, 11:44.

  • #2
    Originally posted by Jan Kaiser
    vielleicht hat ja jemand von euch eine elegantere Lösung parat. Ich denke bei mehreren hundert Datensätzen könnte dieser Vorgang einige Zeit in Anspruch nehmen.
    cu Jan
    Hallo Jan,

    eine elegantere Lösung habe ich auch nicht. (Mit welcher Klasse arbeitest Du eigentlich als Datenquelle?) Aber die Zeit spielt praktisch keine Rolle: Ich habe eine DataTable mit über 1000 Datensätzen und spüre bei einem ähnlichen Suchverfahren keine Verzögerung. Jürgen

    Comment


    • #3
      Hallo,

      Momentan lasse ich die Datensätze mit einer for-schleife durchlaufen
      das ist nur die zweitbeste Lösung. Die DataTable-Klasse stellt über die Methode Select eine Jokersuche über LIKE zur Verfügung. Wenn man einen Treffer hat, kann der betroffene Datensatz über die Datenbindung ausgewählt werden, indem die Eigenschaft Position der BindingSource-Komponente beschrieben wird, nachdem die Methode Find den Primärschlüssel nutzt.

      <div style="font-family: Consolas; font-size: 10pt; color: black; background: white;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> Form1_Load(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataSetSuS.Magazine.AddMagazineRow(<span style="color: #a31515;">"dot.net magazin"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataSetSuS.Magazine.AddMagazineRow(<span style="color: #a31515;">"MSDN Magazin"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataSetSuS.Magazine.AddMagazineRow(<span style="color: #a31515;">"Entwickler Magazin"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataSetSuS.Magazine.AddMagazineRow(<span style="color: #a31515;">"Java Magazin"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataSetSuS.Magazine.AddMagazineRow(<span style="color: #a31515;">"Eclipse Magazin"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataSetSuS.Magazine.AddMagazineRow(<span style="color: #a31515;">"Java Magazin"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; dataSetSuS.Magazine.AddMagazineRow(<span style="color: #a31515;">"PHP Magazin"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> buttonSearchID_Click(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">int</span> iID = 0;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">Int32</span>.TryParse(textBoxID.Text, <span style="color: blue;">out</span> iID);&nbsp; </p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; magazineBindingSource.Position = magazineBindingSource.Find(<span style="color: #a31515;">"id"</span>, iID); </p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">private</span> <span style="color: blue;">void</span> buttonSearchJoker_Click(<span style="color: blue;">object</span> sender, <span style="color: #2b91af;">EventArgs</span> e)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">string</span> sSelect = <span style="color: #2b91af;">String</span>.Format(<span style="color: #a31515;">"magazin LIKE '{0}%'"</span>, textBoxSearchJoker.Text);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: #2b91af;">DataRow</span>[] aDR = dataSetSuS.Magazine.Select(sSelect, <span style="color: #a31515;">"magazin"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (aDR != <span style="color: blue;">null</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; magazineBindingSource.Position = magazineBindingSource.Find(<span style="color: #a31515;">"id"</span>, aDR[0][0]);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p></div>

      Der Vorteil dieses Suchweges liegt darin, dass die im Hintergrund beteiligten Klassen bei Bedarf (Datenmenge) einmalig einen passenden (DataSet-internen) Index anlegen, so dass die nachfolgenden Suchvorgänge entsprechend zügiger ablaufen.

      Comment


      • #4
        Hallo,

        vielen Dank für die schnellen Antworten. Es läuft perfekt.

        Ich habe die "Joker-Suche" in das Change-Ereignis der Textbox eingebunden.
        Somit wird auf die Eingabe direkt reagiert.

        Code:
        privatevoid textBox1_TextChanged(object sender, EventArgs e)
        {
        if (textBox1.Text != "") {
        string sSelect = String.Format("nachname LIKE '{0}%'", textBox1.Text); DataRow[] aDR = dsPersonal.personalliste.Select(sSelect, "nachname"); if (aDR != null) bsPersonal.Position = bsPersonal.Find("ident", aDR[0]["ident"]);
        }
        }
        ich denke das sieht doch ganz nett aus.
        vielen dank

        cu Jan

        Comment


        • #5
          Ich schließe mich dem Dank an Andreas Kosch an! Jürgen

          Comment

          Working...
          X