domingo, 11 de agosto de 2013

AutoComplete TextBox usando Listas Genericas Parte 2

Este ejemplo es la continuación de  AutoComplete TextBox usando Listas Genericas en donde se mostro la forma de usar el AutoCompleteStringCollection de un TextBox usando listas genéricas de propiedades.

En este articulo pretendo explicarles y compartirles la manera de recuperar valores mostrados en un control Textbox con AutoCompleteCustomSource establecida a una fuente de datos, seleccionando el valor en la lista desplegada en el TextBox y mandando datos adicionales a controles del form llamador.

3

El ejemplo es aplicable para aquellos casos en los que no se conocen los parámetros de búsqueda de ciertos registros, por ejemplo, en un punto de venta muchas ocasiones algunos artículos no cuentan con el código de barras o UPC como lo quieran llamar, y no nos sabemos el Id del articulo; en estos casos se requiere de una forma de búsqueda por Descripción, es ahí donde entra el AutoComplete del TextBox ya que podremos buscar el articulo por su nombre y devolver el código de barras del articulo al formulario de ventas para así proceder a la búsqueda de lo demás datos.

En este ejemplo se muestra la manera de lograr esto usando listas genéricas.

Para lograr la comunicación usaremos una interfaz:

   1: namespace AutoCompleteUsingListofT
   2: {
   3:     public interface IMunicipio
   4:     {
   5:  
   6:         void GetValue(int numero, string nombre);
   7:  
   8:     }
   9: }

Para mas información:


Interfaces (Guía de programación de C#)


Para cargar los datos usaremos una clase de Propiedades:



   1: namespace AutoCompleteUsingListofT
   2: {
   3:     public class DataProperties
   4:     {
   5:         public int Numero { get; set; }
   6:         public string Nombre { get; set; }
   7:     }
   8: }

En hacemos que el Form1 herede de la Interfaz para poder recibir los datos:



   1: using System;
   2: using System.Windows.Forms;
   3:  
   4: namespace AutoCompleteUsingListofT
   5: {
   6:     //
   7:     //Heredamos de la interfaz IMunicipio
   8:     //
   9:     public partial class Form1 : Form, IMunicipio
  10:     {
  11:         public Form1()
  12:         {
  13:             InitializeComponent();
  14:         }
  15:  
  16:         //
  17:         //Usamos el metodo contenido dentro de la Interfaz
  18:         //
  19:         public void GetValue(int numero, string nombre)
  20:         {
  21:             //
  22:             //Recuperamos los valores
  23:             //
  24:             textBox1.Text = Convert.ToString(numero);
  25:             textBox2.Text = nombre;
  26:         }
  27:  
  28:         private void button1_Click(object sender, EventArgs e)
  29:         {
  30:             SearchForm frm = new SearchForm(this) {MdiParent = this.MdiParent};
  31:             frm.Show();
  32:         }
  33:     }
  34: }

Creamos una función encargada de llenar una Lista genérica:



   1: /// <summary>
   2: ///  Obtiene informacion de la tabla especificada y devuelve una lista generica de propiedades
   3: /// con los datos recuperados
   4: /// </summary>
   5: /// <autor> Jose Luis Garcia Bautista </autor>
   6: /// <returns>Lista Generica del tipo DataProperties</returns>
   7: public static List<DataProperties> CargarDatos()
   8: {
   9:     //
  10:     // Declaramos una variable del tipo List<Of DataProperties> para cargar los datos recuperados de la BD
  11:     List<DataProperties> lista = new List<DataProperties>();
  12:     //
  13:     //Abrimos la conexión a nuestra Bd usando el archivo de configuracion App.Config
  14:     using (SqlCeConnection cnx = new SqlCeConnection(ConfigurationManager.ConnectionStrings["GeografiaConnectionString"].ToString()))
  15:     {
  16:         //
  17:         //Abrimos la conexión a la Bb
  18:         cnx.Open();
  19:         //
  20:         //Creamos una variable constante para establecer la instruccion SQL
  21:         const string sql = "SELECT * FROM Municipio ORDER BY Nombre ASC";
  22:         //
  23:         //Creamos el objeto Command propio del motor de BD que estemos usando en este caso SqlCeCommand
  24:         SqlCeCommand cmd = new SqlCeCommand(sql, cnx);
  25:         //
  26:         //Creamos el objeto DataReader que se encargara de proporcionarnos las filas de datos obtenidas
  27:         SqlCeDataReader dr = cmd.ExecuteReader();
  28:         //
  29:         // Preguntamos si el objeto DataReader correspondiente contiene datos
  30:         while (dr.Read())
  31:         {
  32:             //
  33:             //Instanciamos la clase contenedora de las propiedades para mepear los datos recuperados
  34:             //de la BD
  35:             DataProperties item = new DataProperties
  36:             {
  37:                 //
  38:                 //Convertimos al tipo de dato correcto
  39:                 Numero = Convert.ToInt32(dr["Numero"]),
  40:                 Nombre = Convert.ToString(dr["Nombre"]),
  41:             };
  42:             //
  43:             //Agregamos el nuevo item a la lista
  44:             lista.Add(item);
  45:         }
  46:  
  47:     }
  48:     //
  49:     //retornamos la lista 
  50:     return lista;
  51: }

Llenamos el AutoCompleteStringCollection con los datos de la lista recuperados por la función CargarDatos():



   1: /// <summary>
   2: /// Carga los item de una lista generica al objeto AutoCompleteStringCollection usado por algunos controles para
   3: /// cumplir con la funcion AutoComplete
   4: /// </summary>
   5: /// <autor> Jose Luis Garcia Bautista </autor>
   6: /// <returns>Regresa AutoCompleteStringCollection</returns>
   7: public static AutoCompleteStringCollection LoadAutocomplete()
   8: {
   9:     //
  10:     //Instanciamos el objeto que se usara para el AutoComplete
  11:     //
  12:     AutoCompleteStringCollection stringdata = new AutoCompleteStringCollection();
  13:     //
  14:     // llamamos a la funcion cargar datos para llenar la lista
  15:     //
  16:     _lista = CargarDatos();
  17:  
  18:     //
  19:     //Ejecutamos un ciclo foreach que recorrera item por item de la lista devuelta por CargarDatos()
  20:     //
  21:     foreach (DataProperties item in _lista)
  22:     {
  23:         //
  24:         //Por cada item encontrado obtenemos el valor de la propiedad Nombre y lo asignamos
  25:         //a AutoCompleteStringCollection
  26:         //
  27:         stringdata.Add(Convert.ToString(item.Nombre));
  28:     }
  29:     //
  30:     //Devolvemos el AutoCompleteStringCollection con los datos cargados
  31:     //
  32:     return stringdata;
  33:  
  34: }

En el Load del form es donde mandaremos a llamar a las funciones anteriores:



   1: /// <summary>
   2: /// Se encarga de cargar el control TextBox con los datos de la lista
   3: /// </summary>
   4: /// <autor> Jose Luis Garcia Bautista </autor>
   5: /// <param name="sender"></param>
   6: /// <param name="e"></param>
   7: private void Form1_Load(object sender, EventArgs e)
   8: {
   9:     try
  10:     {
  11:         //
  12:         //Establecemos las propiedades del control TextBox
  13:         //
  14:         textBox1.AutoCompleteCustomSource = LoadAutocomplete();
  15:         //
  16:         //Para esta propiedad tenemos diferentes opciones (None, Suggest, Append, SuggestAppend)
  17:         // 
  18:         //
  19:         textBox1.AutoCompleteMode = AutoCompleteMode.Suggest;
  20:  
  21:         textBox1.AutoCompleteSource = AutoCompleteSource.CustomSource;
  22:     }
  23:     catch (Exception er)
  24:     {
  25:         //En caso de ocurrir alguna Excepcion atrapamos el mensaje y mostramos al usuario
  26:         MessageBox.Show(string.Format("Error : {0}", er.Message), "Error inesperado", MessageBoxButtons.OK,
  27:                         MessageBoxIcon.Error);
  28:     }
  29: }

Ahora para poder enviar el valor perteneciente a la selección del TextBox usamos el evento TextChanged y usaremos una expresión Lambda para poder obtener los valores de la lista de propiedades:



   1: private void textBox1_TextChanged(object sender, EventArgs e)
   2: {
   3:     DataProperties item = _lista.FirstOrDefault(x => x.Nombre == textBox1.Text);
   4:  
   5:     if (item == null)
   6:         return;
   7:  
   8:     if (Caller != null) Caller.GetValue(item.Numero, item.Nombre);
   9: }


Observen, como seleccionando un item de la lista se envía automáticamente el valor de Numero y Nombre a formulario llamador:


4


Saludos desde Monterrey, Nuevo León México!


Aquí les dejo el proyecto de ejemplo desarrollado en C# y la versión en Vb.Net (próximamente).


Ejemplo en C#


Ejemplo en Vb.Net


Nota: El proyecto fue desarrollado en Vs2010 usando una Bd SqlCompact V3.5 y Framework 4.0

No hay comentarios:

Publicar un comentario

Deja un comentario si el articulo fue de utilidad.