2009-08-31 14 views
15

Ich möchte ein Textbox-Steuerelement haben, das Werte aus einer Datenbank in einer Windows-Anwendung mit C# 2008 und LINQ schlägt und anfügt.AutoComplete TextBox Control

Ich mache es mit einer Combobox, aber ich kann es nicht mit einer Textbox tun.

Wie mache ich das?

+0

Es tut mir leid, ich habe nicht gesehen, dass Sie Windows-Anwendung verwendet haben. – sshow

Antwort

32

Dies ist vielleicht nicht der beste Weg, um Dinge zu tun, aber sollte funktionieren:

this.textBox1.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
this.textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; 

private void textBox1_TextChanged(object sender, EventArgs e) 
{ 
    TextBox t = sender as TextBox; 
    if (t != null) 
    { 
     //say you want to do a search when user types 3 or more chars 
     if (t.Text.Length >= 3) 
     { 
      //SuggestStrings will have the logic to return array of strings either from cache/db 
      string[] arr = SuggestStrings(t.Text); 

      AutoCompleteStringCollection collection = new AutoCompleteStringCollection(); 
      collection.AddRange(arr); 

      this.textBox1.AutoCompleteCustomSource = collection; 
     } 
    } 
} 
+0

SuggestString nicht erlauben, Programm zu starten und sagen: "Der Name 'SuggestStrings' existiert nicht im aktuellen Kontext " –

+13

@ mohammad-reza Wie der Kommentar im Code sagt // SuggestStrings wird die Logik haben, Array von Zeichenfolgen entweder aus Cache/db zurückzugeben. Sie müssen SuggestStrings implementieren. Erwarte nicht, dass du einfach Code von SO kopierst und es wird anfangen zu arbeiten. Wir können Ihnen nur Hinweise geben. –

0

Sie können das KeyDown-Ereignis anhängen und dann die Datenbank nach dem Teil des Textes abfragen, den der Benutzer bereits eingegeben hat. Wenn der Benutzer beispielsweise "T" eingibt, suchen Sie nach Dingen, die mit "T" beginnen. Dann, wenn sie den nächsten Buchstaben eingeben, zum Beispiel "e", suchen Sie nach Dingen in der Tabelle, die mit "Te" beginnen.

Die verfügbaren Elemente könnten z. B. in einer "schwebenden" ListBox angezeigt werden. Sie müssten die ListBox direkt unter der TextBox platzieren, damit sie die verfügbaren Einträge sehen können, und dann die ListBox entfernen, wenn sie fertig sind.

+0

Erste Regel der Programmierung: erfinden Sie das Rad nicht neu;) –

+0

True. Ich wusste nicht, dass es eine Option dafür gab. Ich mache keine Datenbindung, niemals. (Begann mit .Net 1.0, versuchte, einige der Datenbindungsfunktionen zu verwenden, als sie herauskamen, fand sie aber viel zu restriktiv.) –

9

Überprüfen Sie die AutoCompleteSource, AutoCompleteCustomSource und AutoCompleteMode Eigenschaften.

textBox1.AutoCompleteMode = AutoCompleteMode.Suggest; 
textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; 
AutoCompleteStringCollection col = new AutoCompleteStringCollection(); 
col.Add("Foo"); 
col.Add("Bar"); 
textBox1.AutoCompleteCustomSource = col; 

Beachten Sie, dass der Designer Sie ohne tun können, dass jeder Code schreiben ...

+0

Ich möchte von Database.Can Sie mir helfen? Ich möchte aus der Datenbank für Suggest und AutoComplete lesen –

+1

@mohammad reza: Sie müssen Code schreiben mit ADO.net für den Zugriff auf DB. –

+0

füllen Sie einfach die Liste mit den Ergebnissen Ihrer Abfrage –

1

natürlich es hängt davon ab, wie Sie es umsetzen, aber vielleicht ist dies ein guter Anfang:

using System.Windows.Forms; 

public class AutoCompleteTextBox : TextBox { 

    private string[] database;//put here the strings of the candidates of autocomplete 
    private bool changingText = false; 

    protected override void OnTextChanged (EventArgs e) { 
     if(!changingText && database != null) { 
      //searching the first candidate 
      string typed = this.Text.Substring(0,this.SelectionStart); 
      string candidate = null; 
      for(int i = 0; i < database.Length; i++) 
       if(database[i].Substring(0,this.SelectionStart) == typed) { 
        candidate = database[i].Substring(this.SelectionStart,database[i].Length); 
        break; 
       } 
      if(candidate != null) { 
       changingText = true; 
       this.Text = typed+candidate; 
       this.SelectionStart = typed.Length; 
       this.SelectionLength = candidate.Length; 
      } 
     } 
     else if(changingText) 
      changingText = false; 
     base.OnTextChanged(e); 
    } 

} 

Ich bin nicht sicher, dass das sehr gut funktioniert, aber ich denke, dass die Basis dieses Codes gut genug ist.

+0

nicht erkannt hat, dass es Buit-in-Eigenschaften dafür gab. Ich arbeite nicht so viel mit System.Windows.Forms, die letzte Version, wo ich es verwendet wurde. NET Framework 1.1 –

0
private void textBox1_TextChanged(object sender, EventArgs e) 
    { 
     try 
     { 
      textBox1.AutoCompleteMode = AutoCompleteMode.Suggest; 
      textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; 
      AutoCompleteStringCollection col = new AutoCompleteStringCollection(); 
      con.Open(); 
      sql = "select *from Table_Name; 
      cmd = new SqlCommand(sql, con); 
      SqlDataReader sdr = null; 
      sdr = cmd.ExecuteReader(); 
      while (sdr.Read()) 
      { 
       col.Add(sdr["Column_Name"].ToString()); 
      } 
      sdr.Close(); 

      textBox1.AutoCompleteCustomSource = col; 
      con.Close(); 
     } 
     catch 
     { 
     } 
    } 
1
To AutoComplete TextBox Control in C#.net windows application using 
wamp mysql database... 

here is my code.. 

AutoComplete(); 

write this **AutoComplete();** text in form-load event.. 

private void Autocomplete() 
    { 
     try 
     { 
      MySqlConnection cn = new MySqlConnection("server=localhost; 
database=databasename;user id=root;password=;charset=utf8;"); 
      cn.Open(); 
      MySqlCommand cmd = new MySqlCommand("SELECT distinct Column_Name 
    FROM table_Name", cn); 
      DataSet ds = new DataSet(); 
      MySqlDataAdapter da = new MySqlDataAdapter(cmd); 
      da.Fill(ds, "table_Name"); 
      AutoCompleteStringCollection col = new 
      AutoCompleteStringCollection(); 
      int i = 0; 
      for (i = 0; i <= ds.Tables[0].Rows.Count - 1; i++) 
      { 
       col.Add(ds.Tables[0].Rows[i]["Column_Name"].ToString()); 

      } 
      textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource; 
      textBox1.AutoCompleteCustomSource = col; 
      textBox1.AutoCompleteMode = AutoCompleteMode.Suggest; 
      cn.Close(); 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, 
     MessageBoxIcon.Error); 
     } 
    } 
0
You can add a parameter in the query like @emailadd to be added in the aspx.cs file where the Stored Procedure is called with cmd.Parameter.AddWithValue. 
    The trick is that the @emailadd parameter doesn't exist in the table design of the select query, but being added and inserted in the table. 

    USE [DRDOULATINSTITUTE] 
    GO 
    /****** Object: StoredProcedure [dbo].[ReikiInsertRow] Script Date: 5/18/2016 11:12:33 AM ******/ 
    SET ANSI_NULLS ON 
    GO 
    SET QUOTED_IDENTIFIER ON 
    GO 
    ALTER procedure [dbo].[ReikiInsertRow] 
    @Reiki varchar(100), 
    @emailadd varchar(50) 
    as 
    insert into dbo.ReikiPowerDisplay 
    select Reiki,ReikiDescription, @emailadd from ReikiPower 
    where [email protected]; 

Posted By: Aneel Goplani. CIS. 2002. USA 
0

dieses Ergebnis zu erreichen:

enter image description here

Sie kann in zwei Richtungen folgen die Tannen von Umwelt Registerkarte Eigenschaften s, und Einstellung der folgenden Eigenschaften:

enter image description here

Der beste Weg, diesen Effekt durch Code erstellen, siehe mein Beispiel als folgt:

AutoCompleteStringCollection sourceName = new AutoCompleteStringCollection(); 

foreach (string name in listNames) 
{  
    sourceName.Add(name); 
} 

txtName.AutoCompleteCustomSource = sourceName; 
txtName.AutoCompleteMode = AutoCompleteMode.Suggest; 
txtName.AutoCompleteSource = AutoCompleteSource.CustomSource; 
0
private void TurnOnAutocomplete() 
    { 
     textBox.AutoCompleteMode = AutoCompleteMode.SuggestAppend; 
     textBox.AutoCompleteSource = AutoCompleteSource.CustomSource; 
     AutoCompleteStringCollection collection = new AutoCompleteStringCollection(); 
     string[] arrayOfWowrds = new string[]; 

     try 
     { 
      //Read in data Autocomplete list to a string[] 
      string[] arrayOfWowrds = new string[]; 
     } 
     catch (Exception err) 
     { 
      MessageBox.Show(err.Message, "File Missing", MessageBoxButtons.OK, MessageBoxIcon.Error); 
     } 

     collection.AddRange(arrayOFWords); 
     textBox.AutoCompleteCustomSource = collection; 
    } 

Sie müssen dies nur einmal aufrufen, nachdem Sie Ihre Daten für die Autocomplete-Liste benötigen. Einmal gebunden bleibt es bei der textBox. Sie müssen oder wollen es nicht jedes Mal aufrufen, wenn der Text in der textBox geändert wird, wodurch Ihr Programm beendet wird.

Verwandte Themen