martes, 11 de agosto de 2009

Cargar los elementos de un Control DropDownList concatenando los valores de varios Campos de una Tabla de una Base de Datos SQL Server en ASP.Net

Para que en cada elemento de un Control DropDownList (combo) aparezcan concatenados los valores de distintos Campos de una Tabla definida previamente en una Base de datos SQL Server, será necesario realizar una doble Consulta sobre dicha Base de Datos.

Una primera Consulta para cargar el Control tomando como referencia el Campo establecido en la propiedad "DataTextField". Posteriormente, se recorrerán todos los elementos del Combo ejecutando una segunda Consulta para cada uno de estos elementos, de manera que podamos obtener la fila correspondiente y guardar sólo los valores de los campos que necesitamos.

Para ilustrar el ejemplo creamos una Clase Cliente:


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Web;
   5:  using System.Data;
   6:  using System.Data.SqlClient;
   7:   
   8:  namespace BlogSalvatrosh
   9:  {
  10:      public class Cliente
  11:      {
  12:          public Cliente()
  13:          {
  14:          }
  15:   
  16:          private string campoCodigo = string.Empty;
  17:          private string campoNif = string.Empty;
  18:          private string campoNombre = string.Empty;
  19:   
  20:          public string Codigo
  21:          {
  22:              get { return campoCodigo; }
  23:              set { campoCodigo = value; }
  24:          }
  25:   
  26:          public string Nif
  27:          {
  28:              get { return campoNif; }
  29:              set { campoNif = value; }
  30:          }
  31:   
  32:          public string Nombre
  33:          {
  34:              get { return campoNombre; }
  35:              set { campoNombre = value; }
  36:          }
  37:   
  38:   
  39:          /// Ejecuta una consulta SQL (que recibe como parámetro) sobre la Base de Datos devolviendo el resultado de la consulta en un tipo "DataView"
  40:          public DataView CargarLista(string consulta)
  41:          {
  42:              SqlDataAdapter sqlDa = null;
  43:              DataTable dt = new DataTable();
  44:              SqlConnection conexion = new SqlConnection("CadenaDeConexion");
  45:              SqlCommand sqlCmd = new SqlCommand(consulta, conexion);   //Se crea un comando SQL con la consulta y el puente de conexión
  46:   
  47:              sqlDa = new SqlDataAdapter(sqlCmd);
  48:   
  49:              try
                   {
  50:                  conexion.Open();    //Se abre la conexión con la Base de Datos
  51:                  sqlDa.Fill(dt);   //Ejecuta la consulta y la adapta a un "DataTable" definido como "dt"
  52:                  return dt.DefaultView;  //Convierte la consulta en una vista (en un tipo "DataView")
  53:              }
  54:              catch (Exception)
  55:              {
  56:                  return null;
  57:              }
  58:              finally
  59:              {//Se cierra la conexión
  60:                  if (conexion.State == ConnectionState.Open)
  61:                      conexion.Close();
  62:              }
  63:          }
  64:   
  65:   
  66:          /// Construimos un Diccionario de datos con los campos y valores que necesitamos mostrar en el Combo
  67:          public Dictionary<string, string> CargarDiccionario(Dictionary<string, string> miDic)
  68:          {
  69:              //Supongamos que necesitamos guardar las propiedades "Nif" y "Nombre" del Objeto que estamos construyendo
  70:              miDic.Add("Nif", this.Nif);
  71:              miDic.Add("Nombre", this.Nombre);
  72:   
  73:              return miDic;
  74:          }
  75:      }
  76:  }


Y un Control de Usuario muy sencillo denominado "ComboCliente.ascx" que solo posee un Control DropDownList:


   1:  <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ComboCliente.ascx.cs" Inherits="BlogSalvatrosh.ComboCliente" %>
   2:  <asp:DropDownList ID="DropDownListClientes" runat="server"></asp:DropDownList>


En la Clase "ComboCliente.ascx.cs" asociada a este Control de Usuario insertamos el método que va cargando el Combo, al cual le podemos "llamar", para simplificar, desde el propio método Controlador del evento "Load()":


   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Web;
   5:  using System.Web.UI;
   6:  using System.Web.UI.WebControls;
   7:  using System.Data;
   8:   
   9:  namespace BlogSalvatrosh
  10:  {
  11:      public partial class ComboCliente : System.Web.UI.UserControl
  12:      {
  13:   
  14:          protected void Page_Load(object sender, EventArgs e)
  15:          {
  16:              CargarComboConcatenandoCampos();
  17:          }
  18:   
  19:          /// Carga el DropDownList (Combo) concatenando varios campos de alguna tabla de la Base de Datos
  20:          public void CargarComboConcatenandoCampos()
  21:          {
  22:              Cliente clt = new Cliente();
  23:   
  24:              DataView dv = (DataView)clt.CargarLista("Select * from NombreTabla");//Se llama al método "CargarLista(string)" de la Clase Cliente para que realice la consulta especificada
  25:   
  26:              if (dv != null)  //Siempre que la resultado de la consulta no sea null:
  27:              {
  28:                  this.DropDownListClientes.DataSource = dv;  //Se indica que debe tomar como origen de datos el DataView "dv"
  29:                  this.DropDownListClientes.DataTextField = "Codigo"; //Se indica que debe tomar como referencia de contenido el campo "Codigo"
  30:                  this.DropDownListClientes.DataValueField = "Codigo";    //Se indica que debe tomar como valor el valor del campo "Codigo"
  31:   
  32:                  try
  33:                  {
  34:                      this.DropDownListClientes.DataBind();  //Se realiza el enlace con el origen de datos
  35:                  }
  36:                  catch (ArgumentOutOfRangeException)
  37:                  {
  38:                  }
  39:              }
  40:   
  41:              //A continuación recorremos los elementos del Combo anteriormente cargados y le vamos concatenando el valor de otros campos correspondientes al mismo registro:
  42:              foreach (ListItem elemItem in DropDownListClientes.Items)
  43:              {
  44:                  clt.CargarLista("Select * from NombreTabla where Codigo = " + elemItem.Text);    //Volvemos a llamar al método que realiza la consulta sobre la Base de Datos obtieniendo la fila que corresponde con el valor del elemento del Combo actual
  45:                  Dictionary<string, string> camposYvalores = new Dictionary<string, string>();  //Creamos un diccionario de datos 
  46:                  camposYvalores = clt.CargarDiccionario(camposYvalores); //Llamamos al método que carga el Diccionario con los campos y valores que queremos mostrar en el Combo
  47:                  elemItem.Text = string.Empty;   //Vaciamos el elemento del combo
  48:   
  49:                  //Y a continuación volvemos a llenarlo con los valores del registro deseados:
  50:                  foreach (KeyValuePair<string, string> kvp in camposYvalores)
  51:                  {
  52:                      elemItem.Text += kvp.Value + " *** ";   //Al elemento del Combo se le concatena el valor del campo y tres asteriscos para separar los campos
  53:                  }
  54:   
  55:                  elemItem.Text = elemItem.Text.Remove(elemItem.Text.Length - 4, 4);  //Se eliminan los 4 últimos caracteres del elemento del combo (los asteriscos mas un espacio)
  56:              }
  57:          }
  58:      }
  59:  }

No hay comentarios:

Publicar un comentario

Webs amigas:
Eduardo Soriano
Solcan
Taller de Joyería