Tutorial : Hacer Combos Dependientes tipo Departamento –Ciudad

Anuncio
Tutorial : Hacer Combos Dependientes tipo
Departamento –Ciudad en ASP. Net
Hola amigos, les traigo una manera muy muy sencilla hacer combos o listas
desplegables dependientes tipo departamento – ciudad utilizando una
herramienta muy práctica de Asp- Ajax llamada updatepanel, no debemos ser
unos expertos en Ajax solo seguir estos pasos así que sin más preámbulos
empecemos.
He trabajado con la última versión de visual estudio para web pueden
descargar la versión gratuita desde acá
http://www.microsoft.com/visualstudio/esn/downloads#d-express-web
Bueno entonces comencemos:
Antes de todo necesitamos una base de datos
create database prueba;
use prueba;
create table departamento
(cod_departamento int primary key identity(1,100) ,
nombre varchar(80) not null,
)
create table ciudad
(
cod_ciudad int primary key identity(1,100) ,
nombre varchar(50) not null ,
cod_departamento int foreign key references departamento(cod_departamento)not
null,
)
Y los procedimientos
create procedure cons_departamento
as
select cod_departamento, nombre from departamento;
create procedure cons_ciudades
@cod_departamento int
as
select cod_ciudad, nombre from ciudad where cod_departamento= @cod_departamento;
y claro unos datos de prueba
//departamentos
insert into departamento
insert into departamento
values ('AMAZONAS')
values ('ANTIOQUIA')
//ciudades para amazonas
insert into ciudad values ('EL ENCANTO', 1)
insert into ciudad values ('LA CHORRERA', 1)
//ciudades para antioquia
insert into ciudad values('ABRIAQUÍ',101)
insert into ciudad values('ALEJANDRÍA',101)
Primero crearemos una solución en blanco y agregaremos 3 proyectos uno
llamado Lógica será una biblioteca de clases, otro llamado Conexión también
biblioteca de clases y otro llamado Presentación este es un sitio web
Luego agregaremos las referencias
En lógica se agregara referencia al proyecto conexión
Y en presentación se agregaran referencias a conexión y a lógica
Ahora agregaremos clases a nuestros proyectos Lógica y Conexión
Estas se llamaran lógica y conexión respectivamente y se verá así
Dentro de la clase conexión nos conectaremos con la base de datos en SQL
server así
using
using
using
using
using
using
System;
System.Collections.Generic;
System.Linq;
System.Text;
System.Data.SqlClient;
System.Data;
namespace Conexion
{
public class conexion
{
private SqlConnection conex = new SqlConnection(@"Data
Source=.\SQLEXPRESS;Initial Catalog=subasededatos;Integrated Security=True");
private bool conectar()
{
try
{
conex.Open();
return true;
}
catch
{
conex.Close();
return false;
}
}
public bool comando(string comando)
{
bool ret = false;
try
{
if (conectar())
{
SqlCommand cmd = new SqlCommand(comando, conex);
cmd.ExecuteNonQuery();
ret = true;
}
}
catch { }
conex.Close();
return ret;
}
public DataTable consulta(string comando)
{
DataTable ret = new DataTable();
try
{
if (conectar())
{
SqlDataAdapter da = new SqlDataAdapter(comando, conex);
da.Fill(ret);
}
}
catch { }
conex.Close();
return ret;
}
}
}
Y en la clase lógica llamaremos dos pequeños procedimientos almacenados
que se encargaran de cargar las ciudades y departamentos.
Es importante agregar la directiva using
trabajar
System.Data;
en la clase para poder
Y en la clase pondremos
public DataTable departamentos()
{
Conexion.conexion cone = new Conexion.conexion();
DataTable dt = cone.consulta("exec cons_departamento");
return dt;
}
public DataTable ciudades(int cod_departamento )
{
Conexion.conexion cone = new Conexion.conexion();
DataTable dt = cone.consulta("exec cons_ciudades
'"+cod_departamento+"'");
return dt;
}
Y bueno finalmente la página web que puede ser el default o una que ustedes
agreguen, pueden usar css, js y todo lo que quieran.
En la página web haremos lo siguiente
Vamos al cuadro de herramientas y buscamos Extensiones AJAX Y
arrastramos un ScriptManager y un UpdatePanel
Y lo acomodan según sus necesidades en mi caso se ve así en el diseñador
por las css pero ustedes acomódenlo como quieran
en mi caso se verá así al final
Bien en el código tendremos esto un combo “departamento” del cual dependerá
el combo “ciudades”
<div class="styled-select">
<asp:DropDownList ID="departamento" AutoPostBack="true" runat="server"
Height="25px" style="margin-left: 0px; margin-top: 0px;" Width="220px"
OnSelectedIndexChanged="departamento_SelectedIndexChanged" >
</asp:DropDownList>
</div>
// Acá es importante destacar dos cosas uno es necesario que este activado el
AutoPostBack="true" y es importante que este el evento
OnSelectedIndexChanged="departamento_SelectedIndexChanged" > este indicara al
aplicativo que hacer cuando cambie la selección en el combo este se obtiene
dando doble click al combo en el diseñador de visual una vez //
Y acá tenemos el update panel y adentro el combo “ciudades” //el updatepanel
permitirá que solo se recargue esa parte de la página, pueden meter todos los
controles que necesiten recargar esta herramienta es muy útil para traer datos
desde la BD de manera asincrónica //
<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional" >
<ContentTemplate>
<div class="styled-select2">
<asp:DropDownList ID="ciudad" runat="server" Height="27px"
style="margin-left: 0px" Width="220px">
</asp:DropDownList>
</div>
</ContentTemplate>
<Triggers>
<asp:AsyncPostBackTrigger ControlID="departamento"
EventName="SelectedIndexChanged" />
</Triggers>
</asp:UpdatePanel>
//Aca hay dos cosas muy importantes :
<ContentTemplate> este permite introducir los controles en el updatepanel , los
combos, textbox, etc.
La otra cosa es <Triggers> este nos indicara cuando va accionarse el
updatepanel en este caso en el evento de cambio del combo “departamentos”
Si quieren mas información sobre los updatepanel y todo lo que pueden hacer
con ellos miren este link http://msdn.microsoft.com/eses/library/system.web.ui.updatepanel(v=vs.100).aspx//
Continuemos….
Hasta ahora tenemos base de datos, solución, métodos que llaman
procedimientos de la BD y una interfaz ahora vamos a hacer que funcione.
En el evento load de la página que lo pueden encontrar dando doble click sobre
cualquier parte vacía del diseñador pondremos este código
//importante
Ponemos las directivas en la pagina
using System.Data.SqlClient;
using System.Data;
//
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
// carga de los departamentos disponibles en la base de datos
DataTable dt6 = new DataTable();
dt6 = elem.departamentos();
departamento.DataSource = dt6;
departamento.DataTextField = "nombre".ToString();
departamento.DataValueField = "cod_departamento".ToString();
departamento.DataBind();
}
Esto hará que se carguen los departamentos desde cero Solo si es la primera
vez que se carga la página de lo contrario se mantendrá la selección
Y ahora debemos programar lo que ocurrirá cuando seleccionen algo ene l
combo, para entrar al evento podemos hacer doble click sobre el combo
“departamentos” en el diseñador y automáticamente nos llevara al código y una
vez allí pondremos esto
protected void departamento_SelectedIndexChanged(object sender, EventArgs e)
{
int codigo = Convert.ToInt32(this.departamento.SelectedValue);
// carga de las ciudades disponibles en la base de datos, segun su
departamento
DataTable dt7 = new DataTable();
ciudad.Items.Clear();
dt7 = elem.ciudades(codigo);
ciudad.DataSource = dt7;
ciudad.DataTextField = "nombre".ToString();
ciudad.DataValueField = "cod_ciudad".ToString();
ciudad.DataBind();
}
Cuando lo ejecuten ya podrán ver cómo funciona
Gracias espero que les haya servido.
Samanta Cantero.
@zamdd en twitter
Este y más tutoriales : http://titaniumsoluciones.hol.es/
Descargar