2009-08-31 11 views
15

Je souhaite avoir un contrôle de zone de texte qui suggère et ajoute des valeurs à partir d'une base de données dans une application Windows avec C# 2008 et LINQ. Je le fais avec un combobox mais je ne peux pas le faire avec un textbox.AutoComplete TextBox Control

Comment faire?

+0

Je suis désolé, je n'ai pas vu que vous utilisiez l'application Windows. – sshow

Répondre

32

Cela pourrait ne pas être la meilleure façon de faire les choses, mais devrait fonctionner:

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 ne permet pas d'exécuter le programme et dit "Le nom 'SuggestStrings' n'existe pas dans le contexte actuel " –

+13

@ mohammad-reza Comme le commentaire dans le code dit // SuggestStrings aura la logique pour retourner le tableau de chaînes à partir de cache/db. Vous devrez implémenter SuggestStrings. Ne vous attendez pas à ce que vous copiez le code de SO et il commencera à fonctionner. Nous pouvons simplement vous fournir des pointeurs. –

0

Vous pouvez vous connecter à l'événement KeyDown, puis interroger la base de données pour la partie du texte que l'utilisateur a déjà entrée. Par exemple, si l'utilisateur entre "T", recherchez les éléments commençant par "T". Ensuite, quand ils entrent dans la lettre suivante, par exemple "e", chercher des choses dans la table qui commencent par "Te".

Les éléments disponibles peuvent être affichés dans un ListBox "flottant", par exemple. Vous devez placer le contrôle ListBox juste en dessous de la zone de texte afin qu'ils puissent voir les entrées disponibles, puis supprimez le contrôle ListBox quand ils ont terminé de taper.

+0

Première règle de programmation: ne pas réinventer la roue;) –

+0

True. Je n'avais pas réalisé qu'il y avait une option pour ça. Je ne fais pas de liaison de données, jamais. (Commencé avec. Net 1.0, essayé d'utiliser certaines des fonctionnalités de liaison de données quand ils sont sortis, mais les trouve beaucoup trop restrictifs.) –

9

Consultez les propriétés AutoCompleteSource, AutoCompleteCustomSource et AutoCompleteMode.

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

Notez que le concepteur vous permet de le faire sans écrire de code ...

+0

Je veux utiliser à partir de base de données.Pouvez-vous m'aider? Je veux lire à partir de la base de données pour Suggest et AutoComplete –

+1

@mohammad reza: Vous devrez écrire du code en utilisant ADO.net pour accéder à DB. –

+0

il suffit de remplir la liste avec les résultats de votre requête –

1

Bien sûr, il dépend de la façon dont vous le mettre en œuvre, mais peut-être cela est un bon début:

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

} 

Je ne suis pas sûr que cela fonctionne très bien, mais je pense que la base de ce code est assez bonne.

+0

ne s'est pas rendu compte qu'il y avait des propriétés buit-dans pour cela. Je ne travaille pas beaucoup avec System.Windows.Forms, la dernière version où je l'ai utilisé était .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

Pour arriver à ce résultat:

enter image description here

vous

peut suivre deux voies s, les sapins de l'environnement onglet Propriétés et réglage de la suivante propriétés:

enter image description here

La meilleure façon est de créer cet effet par le code, voir mon exemple comme suit:

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

Vous avez seulement besoin de l'appeler une fois que vous avez vos données nécessaires pour la liste de saisie semi-automatique. Une fois lié, il reste avec le textBox. Vous n'avez pas besoin ou ne voulez pas l'appeler chaque fois que le texte est modifié dans le textBox, cela va tuer votre programme.