2009-08-31 16 views
15

Chcę mieć formant pole tekstowe, który sugeruje i dołącz wartości z bazy danych w aplikacji systemu Windows z C# 2008 i LINQ.AutoComplete TextBox Control

Robię to z combobox, ale nie mogę tego zrobić z pola tekstowego.

Jak to zrobić?

+0

Przykro mi, nie widziałem, że używasz aplikacji Windows. – sshow

Odpowiedz

32

To może nie być najlepszym sposobem, aby robić rzeczy, ale powinno działać:

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 nie pozwala uruchomić programu i powiedzieć "Nazwa" SuggestStrings "nie istnieje w bieżącym kontekście " –

+13

@ mohammad-reza Jako komentarz w kodzie mówi // SuggestStrings będzie mieć logikę, aby zwrócić tablicę ciągów albo z pamięci podręcznej/db. Będziesz musiał zaimplementować SuggestStrings. Nie oczekuj, że po prostu skopiujesz kod z SO i zacznie działać. Możemy po prostu zapewnić ci wskazówki. –

0

Można dołączyć do zdarzenia KeyDown, a następnie przeszukać bazę danych dla tej części tekstu, którą użytkownik już wprowadził. Na przykład, jeśli użytkownik wpisze "T", wyszukaj rzeczy rozpoczynające się od "T". Następnie, gdy wprowadzą kolejną literę, na przykład "e", wyszukaj rzeczy w tabeli zaczynające się od "Te".

Dostępne elementy mogą być wyświetlane na przykład w "pływającym" panelu ListBox. Będziesz musiał umieścić ListBox tuż poniżej TextBox, aby mogli zobaczyć dostępne wpisy, a następnie usunąć ListBox po zakończeniu pisania.

+0

Pierwsza zasada programowania: nie wymyślaj ponownie koła;) –

+0

Prawda. Nie zdawałem sobie sprawy, że jest na to opcja. Nigdy nie wiążę danych. (Zaczęło się od .Net 1.0, próbowałem użyć niektórych funkcji łączenia danych po ich ujawnieniu, ale uznałem, że są zbyt restrykcyjne.) –

9

Sprawdź właściwości AutoCompleteSource, i AutoCompleteMode.

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

Zauważ, że projektant pozwala to zrobić bez konieczności pisania kodu ...

+0

Chcę użyć bazy danych. Czy możesz mi pomóc? Chcę odczytywać z bazy danych do zasugerowania i autouzupełniania –

+1

@mohammad reza: Będziesz musiał napisać kod za pomocą ADO.net, aby uzyskać dostęp do DB. –

+0

po prostu wypełnij listę z wynikami zapytania –

1

oczywiście to zależy od sposobu jego realizacji, ale być może jest to dobry początek:

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); 
    } 

} 

Nie jestem pewien, czy to działa bardzo dobrze, ale myślę, że podstawa tego kodu jest wystarczająco dobra.

+0

nie zdało sobie sprawy, że istnieją w tym celu właściwości buit-in. Nie pracuję zbyt wiele z System.Windows.Forms, ostatnią wersją, w której użyłem jej .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

Aby osiągnąć ten wynik:

enter image description here

ci może podążać w obie strony s, jodły by karcie Właściwości środowiska i ustawienie następujące właściwości:

enter image description here

Najlepszym sposobem jest tworzenie tego efektu za pomocą kodu, patrz mój przykład w następujący sposób:

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; 
    } 

Musisz zadzwonić tylko raz, gdy masz już potrzebne dane do listy autouzupełniania. Po związaniu pozostaje z textboxem. Nie musisz lub chcesz wywoływać go za każdym razem, gdy tekst zostanie zmieniony w polu tekstowym, który zabije Twój program.