viernes, 30 de agosto de 2013

Cargar combobox con base de datos de SQL Server en WPF

NOTA: la base  de datos está creada en SQL Server 2012 y la aplicación en Visual Studio 2012 Ultimate
Primeramente les doy a conocer la base de datos con la que se trabaja, a continuación su código:

/*base de datos con la que se va a trabajar*/
create database Escuela
go
/*indicamos la base de datos a usar*/
use Escuela
go
/*tabla de alumnos*/
create table Alumno
(
ID_Alumno int primary key identity(1,1),
Matricula_A varchar(5) not null,
Nombre_A varchar(20) not null,
Apellidop_A varchar(20) not null,
Apellidom_A varchar(20) not null
)
/*tabla de materias*/
create table Materia
(
ID_Materia int primary key identity(1,1),
Nombre varchar(20)
)
/*tabla que relaciona los alumnos con cada una de las materias*/
create table Alumno_Materia
(
ID_Alumno int not null foreign key(ID_Alumno) references Alumno(ID_Alumno),
ID_Materia int not null foreign key(ID_Materia) references Materia(ID_Materia)
)
/*insertamos algunos alumnos*/
insert into Alumno(Matricula_A,Nombre_A,Apellidop_A,Apellidom_A)
values('00001','hugo','arellano','perez'),('00002','leonidas','filias','ruiz'),
/*insertamos algunas materias*/
insert into Materia(Nombre)values('Español'),('Biología'),('Historia'),('Geografía')
,('Matemáticas 1'),('Matemáticas 2'),('Matemáticas 3'),('Dibujo')
/*insertamos en la tabla Alumno_Materia*/
insert into Alumno_Materia(ID_Alumno,ID_Materia)values(1,1),(1,2),(1,3),(1,5),(2,4),(2,6),(2,7),(2,8)
/*consulta con la cual seleccionamos el nombre de las materias que tienen asignadas cada uno de los alumnos*/
select Nombre from Materia inner join Alumno_Materia on Materia.ID_Materia=Alumno_Materia.ID_Materia
inner join Alumno on Alumno_Materia.ID_Alumno=Alumno.ID_Alumno where Alumno.ID_Alumno=1

APLICACIÓN
Enseguida se describe el código de la aplicación WPF, primeramente les muestro la parte de C#:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
/*librerias para manejo de sql server y manejo de dataset*/
using System.Data.SqlClient;
using System.Data;

namespace Cargar_cbox
{
    /// <summary>
    /// Lógica de interacción para MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
        /*variable para la cadena de conexión*/
        public string cadena_conexion=@"Data Source=HUGUITO;Initial Catalog=Escuela;Integrated Security=True;Connect Timeout=30";
        public string id_alumno;
        private void btn_buscamaterias_Click(object sender, RoutedEventArgs e)
        {
            /*llamamos al método que carga las materias*/
            buscamaterias();
        }
        /*método para buscar las materias que lleva cada alumno*/
        public void buscamaterias()
        {
            /*variable de cadena para guardar cada materia que se encuentra en la consulta a la BD*/
            string materia = "";
            /*objeto de conexión*/           
            SqlConnection con = new SqlConnection();
            /*delcaramos un objeto para el comando*/
            SqlCommand comando = new SqlCommand();
            /*declaramos un reader*/
            SqlDataReader dr;
            /*indicamos la conexíon, usamos la variable que contiene la cadena de conexión*/
            con.ConnectionString = cadena_conexion;
            /*indicamos al comando la conexión*/
            comando.Connection = con;
            /*especificamos la consulta en transact sql para el comando, usamos la variable id_alumno para solo traer las materia del alumno seleccionado en el combobox*/
            comando.CommandText = "select Nombre from Materia inner join Alumno_Materia on Materia.ID_Materia=Alumno_Materia.ID_Materia inner join Alumno on Alumno_Materia.ID_Alumno=Alumno.ID_Alumno where Alumno.ID_Alumno="+id_alumno+"";
            /*se indica que el comando es de tipo texto*/
            comando.CommandType = CommandType.Text;
            /*abrimos la conexión*/
            con.Open();
            /*limpiamos los elementos del listbox*/
            lbox_materias.Items.Clear();
            /*ejecutamos el reader para leer en la base de datos*/
            dr = comando.ExecuteReader();
            /*con el siguiente while por cada elemento que encuentre en la BD de acuerdo a nuestra consulta lo guardará en la variable  materia y lo agregará al listbox*/
            while(dr.Read())
            {
                /*asignamos a la variable materia el valor obtenido al hacer la lectura, en este caso el campo Nombre especificado en la consulta */
                materia=dr.GetString(dr.GetOrdinal("Nombre"));
                /*agregamos al listbox la variable materia*/
                lbox_materias.Items.Add(materia);
            }
            /*cerramos la conexión con la base de datos*/
            con.Close();
        }

        /*método para llener el combobox, mostrando las matriculas de los alumnos
         y  teniendo como valor oculto en ID del alumno*/
        public void llenacboxalumnos()
        {
            /*objeto de conexión*/
            SqlConnection conexion = new SqlConnection();
            /*establecemos la cadena de conexión*/
            conexion.ConnectionString = cadena_conexion;
            /*creamos un objeto de dataset*/
            DataSet ds = new DataSet();
            /*creamos un objeto adaptador indicando la consulta en transact sql y el objeto de conexión*/
            SqlDataAdapter da = new SqlDataAdapter("SELECT ID_Alumno, Matricula_A FROM Alumno", conexion);
            /*indicamos al adaptador que se llene usando el dataset con la tabla Alumno*/
            da.Fill(ds, "Alumno");
            /*indicamos al combobox que como fuente de  sus elementos tome al dataset especificando la tabla Alumno*/
            cbox_alumnos.ItemsSource = ds.Tables["Alumno"].DefaultView;
            /*ahora indicamos que despliegue al usuario el campo Matricula de la tabla Alumno, debemos convertir el valor que obtiene en cadena*/
            cbox_alumnos.DisplayMemberPath = ds.Tables["Alumno"].Columns["Matricula_A"].ToString();
            /*indicamos el valor real, el cual será el ID_Alumno d ela misma tabla Alumno, también convertimos a cadena*/
            cbox_alumnos.SelectedValuePath = ds.Tables["Alumno"].Columns["ID_Alumno"].ToString();
        }
        private void Window_Loaded_1(object sender, RoutedEventArgs e)
        {
            /*llamamos al método del llenacboxalumnos*/
            llenacboxalumnos();
        }

        /*evento DropDownClosed del combobox para al seleccionar una matrícula guardar en la variable id_alumno el ID perteneciente a esa matrícula*/
        private void cbox_alumnos_DropDownClosed(object sender, EventArgs e)
        {
            /*tomamos del combobox el valor que en realidad se selecciona, al elegir una matrícula se elige su ID*/
            id_alumno = cbox_alumnos.SelectedValue.ToString();
        }
    }
}

Esta es la parte de XAML:

<Window x:Class="Cargar_cbox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded_1">
    <Grid>
        <ComboBox x:Name="cbox_alumnos" HorizontalAlignment="Left" Margin="47,72,0,0" VerticalAlignment="Top" Width="161" DropDownClosed="cbox_alumnos_DropDownClosed"/>
        <Button x:Name="btn_buscamaterias" Content="Buscar" HorizontalAlignment="Left" Height="21" Margin="264,73,0,0" VerticalAlignment="Top" Width="135" Click="btn_buscamaterias_Click"/>
        <ListBox x:Name="lbox_materias" HorizontalAlignment="Left" Height="153" Margin="95,145,0,0" VerticalAlignment="Top" Width="273"/>

    </Grid>

</Window>



Aquí una descripción de las pantallas del proceso de creación de la aplicación:

Elegimos una aplicacion de Windows Presentation Foundation:


Elegimos la  herramienta ComboBox:
Le damos el nombre de cbox_alumnos:
Tomamos un Button:


Le damos el nombre de btn_buscamaterias:


Agregamos un ListBox:


Asignamos el nombre de lbox_materias:


Dentro del evento Loaded de la forma llamaremos el código que carga el combobox con las matrículas de los alumnos:


Al correr la aplicación se carga el combobox con las matrículas de los alumnos:


En el evento DropDownClosed del combobox cbox_alumnos asignamos a la variable id_alumno el ID al cual pertenece la matrícula que fue seleccionada del mismo combobox:

En el evento Click del botón btn_buscamaterias llamaremos al método que busca las materias asignadas a la matrícula del alumno, las cuales serán mostradas en el listbox lbox_materias:


Ejemplo de la aplicación en funcionamiento, aquí seleccionamos la matrícula 00001, al dar clic en el botón buscar la búsqueda en la base de datos se obtienen cuatro materias, las cuales se muestran en el listbox
lbox_materias:


Ahora con la matrícula 00002:


Aquí la comprobación en SQL Server:


Por último les muestro una imagen del código XAML de la aplicación por si tienen dudas:

Gracias por su atención y espero les ayude en algo en sus labores de programación.