autocomplete en textbox c#

Iniciado por SAGA-gl, 26 Mayo 2015, 06:06 AM

0 Miembros y 1 Visitante están viendo este tema.

SAGA-gl

buenas noches gente del foro...verán tengo una duda...estoy haciendo una aplicación de escritorio en la cual ingreso una serie de datos para darlos de alta en una tabla en una bd....verán cuando ingreso el nro d orden en el textbox presionaba un botón consultar para ver si ya se encontraba esa orden registrada si no estaba, habilitaba los controles para cargar los datos y luego registrarlos....al exponer esta parte d la aplicación (mi tesis) la profesora m la rechazo ya q es tedioso para el usuario presionar un botón para consultar sobre un dato si esta registrado o no....x lo q se m ocurrio implementar un autocomplete en el textbox.....m podrían ayudar sobre la implementación es decir ejemplos y demás? creo entender q al ir escribiendo el dato en el textbox hace la consulta y va trayendo los datos q tngan ese valor? y si no esta podría activar los otros controles y demás x ejemplo?
espero no causar muchas molestias y dsd ya muchas grax
expongo el código q fui realizando hst el momento
Código (csharp) [Seleccionar]
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace RegistrarOCspp2
{
    public partial class RegistrarOrden : Form
    {
        public RegistrarOrden()
        {
            InitializeComponent();
           
        }

        private void studioButton2_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void RegistrarOrden_Load(object sender, EventArgs e)
        {
            // TODO: esta línea de código carga datos en la tabla 'proyectoSaludDataSet7.medicamentos1' Puede moverla o quitarla según sea necesario.
            this.medicamentos1TableAdapter.Fill(this.proyectoSaludDataSet7.medicamentos1);

        }

        private static void OnlyNumber(KeyPressEventArgs e, bool isdecimal)
        {
            String aceptados;
            if (!isdecimal)
            {
                aceptados = "0123456789," + Convert.ToChar(8);
            }
            else
                aceptados = "0123456789." + Convert.ToChar(8);

            if (aceptados.Contains("" + e.KeyChar))
            {
                e.Handled = false;
            }
            else
            {
                e.Handled = true;
            }
        }

        private void txtUnidad_KeyPress(object sender, KeyPressEventArgs e)
        {

            if (!Char.IsNumber(e.KeyChar) && e.KeyChar != (char)8)
            {

                e.Handled = true;
                OnlyNumber(e, false);

            }
        }

        private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
        {

            if (!Char.IsNumber(e.KeyChar) && e.KeyChar != (char)8)
            {

                e.Handled = true;
                OnlyNumber(e, false);

            }
        }

        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (char.IsDigit(e.KeyChar))
                e.Handled = false;
            else if (char.IsControl(e.KeyChar))
                e.Handled = false;
            else if (char.IsSeparator(e.KeyChar))
                e.Handled = false;
            else
                e.Handled = true;
        }


        private void textBox1_Click(object sender, EventArgs e)
        {
            System.Windows.Forms.ToolTip ToolTip1 = new System.Windows.Forms.ToolTip();
            ToolTip1.SetToolTip(this.txtNumero, "Ejemplo: 2290");
            txtCantidad.Enabled = true;

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (txtCantidad.Text == "" || txtPrograma.Text == "" || txtPrecio.Text == "")
            {
               
                DialogResult ds = MessageBox.Show(this, "DEBE COMPLETAR TODOS LOS CAMPOS", "ATENCION", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
                this.Text = ds.ToString();

            }
            else

                if (txtCantidad.Text != "" || txtPrograma.Text != "" || txtPrecio.Text != "")
                {
                   
                   
                    string medicamento = comboMedicamento.Text;
                    int cantidad = int.Parse(txtCantidad.Text);
                    string programa = txtPrograma.Text;
                    float precio = float.Parse(txtPrecio.Text);
                    dgv.Rows.Add(medicamento, cantidad, programa, precio, cantidad * precio);
                    button3.Enabled = true;
                   

                }

        }

        private void button4_Click(object sender, EventArgs e)
        {
            this.Close();
        }


        private void button3_Click(object sender, EventArgs e)
        {


            int fila = dgv.CurrentRow.Index;
            if (fila == 0)
                button3.Enabled = false;
            dgv.Rows.RemoveAt(fila);
           


        }

       

       
       
    }
}

nolasco281

#1
Hola como estas.

Si a tu profesora no le gusto que el usuario aprete el boton para buscar puedes usar el evento KeyDown para buscar el codigo y dejar el foco ahi para que siga buscando.

Aca te dejo un ejemplo cuando presione Enter dentro de textbox busque tu registro, espero me entiendas es lo unico que se me ocurre.

Código (vbnet) [Seleccionar]
Private Sub txtBuscarEmpleado_KeyDown(sender As Object, e As KeyEventArgs) Handles txtBuscarEmpleado.KeyDown
       If (e.KeyCode = Keys.Enter) Then
           buscarCodigoEmpleado()
           txtBuscarEmpleado.focus()
End If






Veo que Elektro te dio una solucion mas facil puedes cargar tu registros al combox desde la BD y luego el auto completado como el indica.

Saludos
Lo que se puede imaginar... se puede programar.

Eleкtro

#2
Puedes utilizar un TextBox o también un ComboBox, el procedimiento es el mismo que explico a continuación, pero si los datos que se puedan buscar ya están pre-definidos entonces preferiblemente utiliza un ComboBox, no un TextBox.

Asignas el modo de completado deseado a la propiedad ComboBox.AutoCompleteMode, y el valor de ComboBox.AutoCompleteSource por la lista de items actual (AutoCompleteSource.ListItems) o una colección de strings personalizada (AutoCompleteSource.CustomSource)

Ejemplo en VB.Net (para no ponértelo todo tan fácil):
Código (vbnet) [Seleccionar]
Dim items As String() = {"qwerty", "asdfg", "zxcvb"}

Dim autoCompleteSource As New AutoCompleteStringCollection
autoCompleteSource.AddRange(items)

With ComboBox1
   .SuspendLayout()
   .BeginUpdate()

   .Items.AddRange(items)
   .AutoCompleteCustomSource = autoCompleteSource
   .AutoCompleteMode = AutoCompleteMode.SuggestAppend
   .AutoCompleteSource = Windows.Forms.AutoCompleteSource.CustomSource

   .EndUpdate()
   .ResumeLayout()
End With


El resto sería cómo ha comentado @nolasco281, te suscribes al evento ComboBox.KeyDown (o también ComboBox.SelectedValueChanged con una diferencia de funcionalidad), y realizas la query.

Saludos!








seba123neo

en realidad no, el AutoComplete no consulta a ningun lado mientras escribis, digamos que es un "array precargado" de strings que ya estan cargados en el control, y cuando escribis lo unico que hace es buscar sobre ese "array interno", sino imaginate cada vez que escribis tendrias que consultar la base de datos y seria un tremendo gasto de recursos.

en internet podes encontrar un monton de ejemplos de autocomplete simple en .NET, son pocas lineas de codigo, despues adaptalo a lo tuyo.

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

DarK_FirefoX

Creo que con lo que dice @Eleкtro ya lo tienes resuelto, igual, cualquier cosa pregunta de nuevo.

Ahora, quiero hacerte una sugerencia, esto es algo que realmente puedes tener en cuenta para el desarrollo de tus proyetos. Utiliza un solo lenguaje para definir tus cosas, o sea, si utilizas el español para identificar tus variables, métodos, etc. Mantenlo así en todo el proyecto, evita utilizar español aquí e inglés alla. También sería bueno si te acostumbraras a darle nombres descriptivos a tus controles/variables y evitar cosas como Button1, Button2, etc. Esto le dará claridad a tu código

Salu2s

SAGA-gl

como siempre....me han servido d gran ayuda vuestros comentarios muchas grax x responder SLDS!!!