2009-08-31 4 views
15

Я хочу иметь элемент управления текстовыми полями, который предлагает и добавляет значения из базы данных в приложении Windows с C# 2008 и LINQ.AutoComplete TextBox Control

Я делаю это с помощью combobox, но я не могу сделать это с помощью текстового поля.

Как это сделать?

+0

Извините, я не видел, что вы использовали приложение Windows. – sshow

ответ

32

Это может быть не лучший способ делать вещи, но должно работать:

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 не позволяет запускать программу и говорит: «Имя« SuggestStrings »не существует в текущем контексте " –

+13

@ mohammad-reza Как комментарий в коде говорит // У рассылкиString будет логика для возврата массива строк из кеша/db. Вам нужно будет реализовать SuggestStrings. Не ожидайте, что вы просто скопируете код из SO, и он начнет работать. Мы можем просто предоставить вам указатели. –

0

Вы можете прикрепить к событию KeyDown, а затем запросить базу данных для той части текста, которую пользователь уже ввел. Например, если пользователь вводит «Т», выполните поиск вещей, начинающихся с «Т». Затем, когда они вводят следующую букву, например «e», найдите вещи в таблице, которые начинаются с «Te».

Доступные элементы могут отображаться, например, в «плавающей» ListBox. Вам нужно будет поместить ListBox только под TextBox, чтобы они могли видеть доступные записи, а затем удалить ListBox, когда они будут введены.

+0

Первое правило программирования: не изобретать велосипед;) –

+0

Правда. Не понимал, что для этого есть выбор. Я никогда не занимаюсь привязкой данных. (Начал с .Net 1.0, пытался использовать некоторые функции привязки данных, когда они выходили, но нашел их слишком ограничительными.) –

9

Проверьте AutoCompleteSource, AutoCompleteCustomSource и AutoCompleteMode Недвижимость.

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

Обратите внимание, что конструктор позволяет сделать это без написания кода ...

+0

Я хочу использовать базу данных. Можете ли вы мне помочь? Я хочу прочитать из базы данных для «Предложить и автозаполнение» –

+1

@mohammad reza: вам нужно будет написать код с помощью ADO.net для доступа к БД. –

+0

просто заполните список по вашему запросу –

1

, конечно, это зависит от того, как вы реализуете его, но, возможно, это хорошее начало:

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

} 

Я не уверен, что это работает очень хорошо, но я думаю, что база этого кода достаточно хороша.

+0

не понял, что для этого существуют свойства buit-in. Я не очень много работаю с System.Windows.Forms, последней версией, где я ее использовал .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

Для достижения этого результата:

enter image description here

вам может следовать по два пути s, ели по окружающей вкладке Свойства и установив следующие свойства:

enter image description here

Самый лучший способ создать этот эффект с помощью кода, см мой пример, как следует:

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

Вам нужно будет позвонить только один раз после того, как ваши данные будут необходимы для списка автозаполнения. После привязки он остается в текстовом поле. Вы не должны или хотите вызывать его каждый раз, когда текст изменяется в текстовом поле, что приведет к укушению вашей программы.

Смежные вопросы