Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: SAGA-gl en 26 Mayo 2015, 06:06 am



Título: autocomplete en textbox c#
Publicado por: SAGA-gl en 26 Mayo 2015, 06:06 am
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
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Windows.Forms;
  9.  
  10. namespace RegistrarOCspp2
  11. {
  12.    public partial class RegistrarOrden : Form
  13.    {
  14.        public RegistrarOrden()
  15.        {
  16.            InitializeComponent();
  17.  
  18.        }
  19.  
  20.        private void studioButton2_Click(object sender, EventArgs e)
  21.        {
  22.            this.Close();
  23.        }
  24.  
  25.        private void RegistrarOrden_Load(object sender, EventArgs e)
  26.        {
  27.            // TODO: esta línea de código carga datos en la tabla 'proyectoSaludDataSet7.medicamentos1' Puede moverla o quitarla según sea necesario.
  28.            this.medicamentos1TableAdapter.Fill(this.proyectoSaludDataSet7.medicamentos1);
  29.  
  30.        }
  31.  
  32.        private static void OnlyNumber(KeyPressEventArgs e, bool isdecimal)
  33.        {
  34.            String aceptados;
  35.            if (!isdecimal)
  36.            {
  37.                aceptados = "0123456789," + Convert.ToChar(8);
  38.            }
  39.            else
  40.                aceptados = "0123456789." + Convert.ToChar(8);
  41.  
  42.            if (aceptados.Contains("" + e.KeyChar))
  43.            {
  44.                e.Handled = false;
  45.            }
  46.            else
  47.            {
  48.                e.Handled = true;
  49.            }
  50.        }
  51.  
  52.        private void txtUnidad_KeyPress(object sender, KeyPressEventArgs e)
  53.        {
  54.  
  55.            if (!Char.IsNumber(e.KeyChar) && e.KeyChar != (char)8)
  56.            {
  57.  
  58.                e.Handled = true;
  59.                OnlyNumber(e, false);
  60.  
  61.            }
  62.        }
  63.  
  64.        private void textBox3_KeyPress(object sender, KeyPressEventArgs e)
  65.        {
  66.  
  67.            if (!Char.IsNumber(e.KeyChar) && e.KeyChar != (char)8)
  68.            {
  69.  
  70.                e.Handled = true;
  71.                OnlyNumber(e, false);
  72.  
  73.            }
  74.        }
  75.  
  76.        private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
  77.        {
  78.            if (char.IsDigit(e.KeyChar))
  79.                e.Handled = false;
  80.            else if (char.IsControl(e.KeyChar))
  81.                e.Handled = false;
  82.            else if (char.IsSeparator(e.KeyChar))
  83.                e.Handled = false;
  84.            else
  85.                e.Handled = true;
  86.        }
  87.  
  88.  
  89.        private void textBox1_Click(object sender, EventArgs e)
  90.        {
  91.            System.Windows.Forms.ToolTip ToolTip1 = new System.Windows.Forms.ToolTip();
  92.            ToolTip1.SetToolTip(this.txtNumero, "Ejemplo: 2290");
  93.            txtCantidad.Enabled = true;
  94.  
  95.        }
  96.  
  97.        private void button1_Click(object sender, EventArgs e)
  98.        {
  99.            if (txtCantidad.Text == "" || txtPrograma.Text == "" || txtPrecio.Text == "")
  100.            {
  101.  
  102.                DialogResult ds = MessageBox.Show(this, "DEBE COMPLETAR TODOS LOS CAMPOS", "ATENCION", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
  103.                this.Text = ds.ToString();
  104.  
  105.            }
  106.            else
  107.  
  108.                if (txtCantidad.Text != "" || txtPrograma.Text != "" || txtPrecio.Text != "")
  109.                {
  110.  
  111.  
  112.                    string medicamento = comboMedicamento.Text;
  113.                    int cantidad = int.Parse(txtCantidad.Text);
  114.                    string programa = txtPrograma.Text;
  115.                    float precio = float.Parse(txtPrecio.Text);
  116.                    dgv.Rows.Add(medicamento, cantidad, programa, precio, cantidad * precio);
  117.                    button3.Enabled = true;
  118.  
  119.  
  120.                }
  121.  
  122.        }
  123.  
  124.        private void button4_Click(object sender, EventArgs e)
  125.        {
  126.            this.Close();
  127.        }
  128.  
  129.  
  130.        private void button3_Click(object sender, EventArgs e)
  131.        {
  132.  
  133.  
  134.            int fila = dgv.CurrentRow.Index;
  135.            if (fila == 0)
  136.                button3.Enabled = false;
  137.            dgv.Rows.RemoveAt(fila);
  138.  
  139.  
  140.  
  141.        }
  142.  
  143.  
  144.  
  145.  
  146.  
  147.    }
  148. }
  149.  


Título: Re: autocomplete en textbox c#
Publicado por: nolasco281 en 26 Mayo 2015, 07:20 am
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
  1. Private Sub txtBuscarEmpleado_KeyDown(sender As Object, e As KeyEventArgs) Handles txtBuscarEmpleado.KeyDown
  2.        If (e.KeyCode = Keys.Enter) Then
  3.            buscarCodigoEmpleado()
  4.            txtBuscarEmpleado.focus()
  5. 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


Título: Re: autocomplete en textbox c#
Publicado por: Eleкtro en 26 Mayo 2015, 07:22 am
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
  1. Dim items As String() = {"qwerty", "asdfg", "zxcvb"}
  2.  
  3. Dim autoCompleteSource As New AutoCompleteStringCollection
  4. autoCompleteSource.AddRange(items)
  5.  
  6. With ComboBox1
  7.    .SuspendLayout()
  8.    .BeginUpdate()
  9.  
  10.    .Items.AddRange(items)
  11.    .AutoCompleteCustomSource = autoCompleteSource
  12.    .AutoCompleteMode = AutoCompleteMode.SuggestAppend
  13.    .AutoCompleteSource = Windows.Forms.AutoCompleteSource.CustomSource
  14.  
  15.    .EndUpdate()
  16.    .ResumeLayout()
  17. 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!


Título: Re: autocomplete en textbox c#
Publicado por: seba123neo en 26 Mayo 2015, 07:23 am
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.


Título: Re: autocomplete en textbox c#
Publicado por: DarK_FirefoX en 26 Mayo 2015, 19:04 pm
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


Título: Re: autocomplete en textbox c#
Publicado por: SAGA-gl en 27 Mayo 2015, 06:47 am
como siempre....me han servido d gran ayuda vuestros comentarios muchas grax x responder SLDS!!!