Автозаполнение TextBox Control - PullRequest
18 голосов
/ 31 августа 2009

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

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

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

Ответы [ 9 ]

36 голосов
/ 31 августа 2009

Возможно, это не лучший способ сделать что-то, но он должен работать:

 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;
        }
    }
}
11 голосов
/ 31 августа 2009

Проверьте свойства AutoCompleteSource, AutoCompleteCustomSource и AutoCompleteMode.

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

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

2 голосов
/ 10 ноября 2017
    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;
    }

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

2 голосов
/ 17 октября 2017

Чтобы достичь этого результата:

enter image description here

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

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;
1 голос
/ 19 сентября 2015
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);
        }
    }
1 голос
/ 31 августа 2009

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

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 голосов
/ 18 мая 2016
    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
0 голосов
/ 20 декабря 2012
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
        {
        }
    }
0 голосов
/ 31 августа 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...