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: }