Control AutoComplete TextBox

Quiero tener un control de cuadro de texto que sugiera y anexe valores de una base de datos en una aplicación de Windows con C # 2008 y LINQ.

Lo hago con un combobox pero no puedo hacerlo con un cuadro de texto.

¿Cómo lo hago?

Esta podría no ser la mejor manera de hacer las cosas, pero debería funcionar:

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

Consulte las propiedades AutoCompleteSource , AutoCompleteCustomSource y AutoCompleteMode .

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

Tenga en cuenta que el diseñador le permite hacer eso sin escribir ningún código …

por supuesto, depende de cómo lo implemente, pero quizás este es un buen comienzo:

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

No estoy seguro de que esto esté funcionando muy bien, pero creo que la base de este código es lo suficientemente buena.

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

Para alcanzar este resultado:

enter image description here

puede seguir dos caminos, el primero por la pestaña Propiedades del entorno y establecer las siguientes propiedades:

enter image description here

La mejor manera es crear este efecto por código, vea mi ejemplo de la siguiente manera:

 AutoCompleteStringCollection sourceName = new AutoCompleteStringCollection(); foreach (string name in listNames) { sourceName.Add(name); } txtName.AutoCompleteCustomSource = sourceName; txtName.AutoCompleteMode = AutoCompleteMode.Suggest; txtName.AutoCompleteSource = AutoCompleteSource.CustomSource; 
  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; } 

Solo necesita llamar esto una vez que tenga los datos necesarios para la lista de autocompletar. Una vez enlazado permanece con el cuadro de texto. No necesita o no quiere llamarlo cada vez que se cambia el texto en el cuadro de texto, eso matará su progtwig.

Puede adjuntar al evento KeyDown y luego consultar la base de datos para la parte del texto que el usuario ya ha ingresado. Por ejemplo, si el usuario ingresa “T”, busca cosas que comiencen con “T”. Luego, cuando ingresen la siguiente letra, por ejemplo “e”, busque elementos en la tabla que comiencen con “Te”.

Los elementos disponibles podrían mostrarse en un ListBox “flotante”, por ejemplo. Debería colocar el ListBox justo debajo del TextBox para que puedan ver las entradas disponibles, luego eliminar el ListBox cuando terminen de escribir.

 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 { } } 
  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 Reiki=@Reiki; Posted By: Aneel Goplani. CIS. 2002. USA