c#: ¿cómo crear una función de Autocompletar personalizada como la función de Autocompletar incorporada?

CorePress2024-01-24  7

Quiero crear una función de autocompletar como la función de autocompletar incorporada donde, cuando escribimos en el editor de texto del cuadro combinado, aparece una sugerencia coincidente como esta:

No quiero utilizar el modo Autocompletar incorporado. Creé una colección denominada AutoCompleteStringCollection y la llené con los datos de mi base de datos. Realmente no sé por dónde empezar porque soy muy nuevo en la programación y lo busqué en Internet pero no encontré nada relacionado. Estoy realmente estancado, por favor ayuda.

Intenté esto pero sabía que no funcionará como quiero

private void comboBox1_TextChanged(object sender, EventArgs e)
    {
        foreach(string s in collection)
        {
            if (s.Contains(comboBox1.Text))
            {
                comboBox1.Text = s;
            }
        }
    }

la forma más sencilla es utilizar componentes de terceros como devexpress.

Ahmad Javadi Nezhad

27 de marzo de 2021 a las 10:26

@jvnd soy un estudiante y no puedo permitirme los servicios de devexpress.

- Prashant

27 de marzo de 2021 a las 10:56



------------------------------------

Puedes probar el siguiente código para lograr la función de autocompletar en el cuadro combinado.

      private void Form1_Load(object sender, EventArgs e)
    {
        string[] source = new string[] { "Jack", "Jassie", "Junk", "Jungle" };
        comboBox1.AutoCompleteMode = AutoCompleteMode.Append;
        comboBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
        AutoCompleteStringCollection combData = new AutoCompleteStringCollection();
        combData.AddRange(source);
        comboBox1.AutoCompleteCustomSource = combData;
        comboBox1.Items.AddRange(source);
    }
    int i = 1;
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {
        if ((this.ActiveControl == comboBox1) && (keyData == Keys.Down))
        {
            if(i%2!=0)
            {
                comboBox1.SelectedIndex = comboBox1.FindStringExact(comboBox1.Text);
                textBox1.Text = comboBox1.SelectedIndex.ToString();
                i++;
                return true;
            }
            else
            {
                int index = comboBox1.FindStringExact(comboBox1.Text) + 1;
                if(index<comboBox1.Items.Count)
                {
                    comboBox1.SelectedIndex = comboBox1.FindStringExact(comboBox1.Text) + 1;
                    textBox1.Text = comboBox1.SelectedIndex.ToString();
                    i++;
                    return true;
                }
                else
                {
                  
                    return true;
                }
               
            }
           
            
        }
        else
        {
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }

Resultado:

3

gracias, quiero que cuando escribo "ja" autocompletar me muestra la primera coincidencia posible "jack" y cuando presiono la tecla abajo no debería pasar a la siguiente coincidencia "jassie" pero debería seleccionar "jack" como índice seleccionado y luego, cuando vuelvo a presionar la tecla de flecha hacia abajo, debería seleccionar el siguiente índice después de "jack" índice, pero en mi caso, cuando presiono la tecla de flecha hacia abajo, el autocompletado mantiene seleccionado "ja" y la búsqueda de la siguiente coincidencia comienza con "ja". Si no utilizas el autocompletado y escribes "ja" esNo sugeriré nada, pero cuando presione la tecla hacia abajo seleccionará "jack". Quiero esta misma funcionalidad pero debería sugerir "jack".

- Prashant

29/03/2021 a las 13:42

@prashant, he actualizado mi código según tus necesidades. Comprueba si funciona para ti.

- Jack J Jun

30 de marzo de 2021 a las 2:51

muchas gracias por tuayuda. Hice algunos ajustes en el código y ahora funciona como quería. Estoy poniendo lo que hice en respuesta. gracias de nuevo.

- Prashant

30 de marzo de 2021 a las 9:36



------------------------------------

int i = 0;
    protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
    {

        if ((this.ActiveControl == comboBox1) && keyData == Keys.Down && i == 0)
        {
            
                comboBox1.SelectedIndex = comboBox1.FindStringExact(comboBox1.Text);
                comboBox1.SelectAll();
                i = 1;
                return true;
        }
        else if((this.ActiveControl == comboBox1) && keyData == Keys.Down && i == 1)
        {
            if (comboBox1.SelectedIndex < comboBox1.Items.Count -1)
            {
                comboBox1.SelectedIndex++;
                comboBox1.SelectAll();
            }
            return true;
        }
        if ((this.ActiveControl == comboBox1) && keyData == Keys.Up && i == 0)
        {
            comboBox1.SelectedIndex = comboBox1.FindStringExact(comboBox1.Text);
            comboBox1.SelectAll();
            i = 1;
            return true;
        }
        else if((this.ActiveControl == comboBox1) && keyData == Keys.Up && i == 1 )
        {
            comboBox1.SelectedIndex--;
            comboBox1.SelectAll();
            if(comboBox1.SelectedIndex < 0)
            {
                comboBox1.SelectedIndex = 0;
            }
            return true;
        }
        else
        {
            i = 0;
            return base.ProcessCmdKey(ref msg, keyData);
        }
    }

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare