2009-08-31 22 views
15

Desidero avere un controllo casella di testo che suggerisca e aggiunga valori da un database in un'applicazione Windows con C# 2008 e LINQ.Controllo TextBox automatico completo

Lo faccio con una casella combinata ma non riesco a farlo con una casella di testo.

Come faccio?

+0

Mi dispiace, non ho visto che stavi usando l'applicazione Windows. – sshow

risposta

32

questo potrebbe non essere il modo migliore di fare le cose, ma dovrebbe funzionare:

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 non consente di eseguire programmi e dice "Il nome 'SuggestStrings' non esiste nel contesto corrente " –

+13

@ mohammad-reza Come dice il commento nel codice // SuggestStrings avrà la logica per restituire l'array di stringhe dalla cache/db. Dovrai implementare SuggestStrings. Non aspettarti che copi il codice da SO e inizi a funzionare. Possiamo solo fornirti dei suggerimenti. –

0

È possibile allegare all'evento KeyDown e quindi interrogare il database per quella porzione di testo che l'utente ha già inserito. Ad esempio, se l'utente inserisce "T", cerca le cose che iniziano con "T". Quindi, quando inseriscono la lettera successiva, ad esempio "e", cerca le cose nella tabella che iniziano con "Te".

Gli articoli disponibili potrebbero essere visualizzati in un ListBox "mobile", ad esempio. Dovresti posizionare il ListBox appena sotto il TextBox in modo che possano vedere le voci disponibili, quindi rimuovere il ListBox quando hanno finito di digitare.

+0

Prima regola di programmazione: non reinventare la ruota;) –

+0

Vero. Non sapevo che c'era un'opzione per questo. Non leggo i dati, mai. (Iniziato con .Net 1.0, ho provato a utilizzare alcune delle funzionalità di associazione dati quando sono usciti, ma li ho trovati troppo restrittivi.) –

9

Controlla le proprietà AutoCompleteSource, AutoCompleteCustomSource e AutoCompleteMode.

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

Nota che il designer permette di farlo senza scrivere codice ...

+0

Voglio usare da Database. Mi aiuti? Voglio leggere dal database per Suggest e Completamento automatico –

+1

@mohammad reza: Dovrai scrivere codice usando ADO.net per accedere a DB. –

+0

basta compilare l'elenco con i risultati della query –

1

Naturalmente dipende da come si sceglie di implementare, ma forse questo è un buon inizio:

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

} 

Non sono sicuro che funzioni molto bene, ma penso che la base di questo codice sia abbastanza buona.

+0

non ha realizzato che c'erano proprietà buit-in per questo. Non lavoro molto con System.Windows.Forms, l'ultima versione in cui l'ho usato era .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

Per raggiungere questo risultato:

enter image description here

voi può seguire in due direzioni s, gli abeti di ambiente scheda Proprietà e impostare la seguente proprietà:

enter image description here

Il modo migliore è creare questo effetto dal codice, vedere il mio esempio come segue:

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

Devi solo chiamarlo una volta dopo aver avuto i tuoi dati necessari per l'elenco di completamento automatico. Una volta legato rimane con il textBox. Non è necessario o si desidera chiamarlo ogni volta che il testo viene modificato nella casella di testo, che ucciderà il programma.

Problemi correlati