Colaboraciones en el Guille

Usando el CascadingDropDown de AtlasToolkit con una base de datos

Ejemplo con controles Atlas para aplicaciones web estilo Ajax

 

Fecha: 06/Jun/2006 (Junio 3 de 2006)
Autor: Gabriel Flores - gabriel.flores@yahoo.com

 


Ajax con ASP.NET: Atlas

En una entrada anterior platicaba sobre las bondades de Ajax y en particular del framework de Atlas para ASP.NET y su Atlas Control Toolkit en particular. Y todo esto viene a relucir por la nueva forma de hacer aplicaciones web más dinámicas, más útiles para el usuario, más atractivas y más rápidas. La forma en las que se pueden hacer con ASP.NET 2.0 es con la implementación Atlas. Pues ahora quiero ver si me puedo explicar como hacer que el ComboBox sea llenado con datos desde una base de datos. En el ejemplo de CascadingDropDown se hace con una fuente de datos XML, pero bueno, no tenemos SQL Server 2005 Express para no usarlo ¿verdad? ;)

Requisitos

Empezamos con el hecho de que necesitamos ASP.NET 2.0 para poder usar estos controles, ya sea con un Visual Studio 2005 o con Visual Web Developer.

Ahora sí, podemos empezar con este ejercicio.

Procedimiento

Página web Atlas

Debemos crear un nuevo website (si no lo has hecho ya) y recuerda seleccionar “”Atlas” Website” de la lista de Templates disponibles.

Nuevo Website Atlas

Agregar a Default.aspx tres controles DropDownList simples y llamarlos apropiadamente, por ejemplo:

ddlEmployees
ddlOrders
ddlOrderDetails

El ScriptManager se puede dejar donde está, lo usa Atlas para su funcionamiento.

Agregar un CascadingDropDown Extender del tab de Atlas ControlToolkit:

Controles del AtlasToolkit en la página

El webservice

Sí, llenaremos los DropDown de una base de datos, pero nos resultará más sencillo si esos datos los obtenemos y proveemos con un Webservice, entonces en el Solution Explorer, en el nombre del proyecto damos click derecho y seleccionamos ”Add New Item…”, y en la caja de diálogo elegimos “Webservice” y lo nombramos:

Nuevo webservice

Debemos incluir la librería de Atlas y para manejar datos:

using AtlasControlToolkit;
using System.Data;
using System.Data.SqlClient;

El Webservice nos proveerá en realidad strings que el CascadingDropDown Extender puede manipular para llenar los DropDowns. Por lo que los Webmethods que creemos, los haremos a base de estos. Nota importante: esta solución no es nada elegante, es sólo para efectos de muestra y el connectionString nunca hay que escribirlo así en soluciones de producción.

El primero, nos regresará simplemente los empleados:

    [WebMethod]
    public CascadingDropDownNameValue[] GetEmployees(
        string knownCategoryValues, string category)
    {

        SqlConnection connection = new 
            SqlConnection(@"Data Source=SERVER\SQLEXPRESS;
                Initial Catalog=Northwind;
                Integrated Security=True");

        SqlCommand command = new SqlCommand("SELECT * FROM Employees");

        command.Connection = connection;
        connection.Open();

        SqlDataAdapter adapter = new SqlDataAdapter(command);
        DataSet dataSet = new DataSet();

        adapter.Fill(dataSet);
        command.Connection.Close();

        DataTable tbl = dataSet.Tables[0];

        List<CascadingDropDownNameValue> values = 
            new List<CascadingDropDownNameValue>();
        foreach (DataRow dr in tbl.Rows)
        {
            string sEmployee = (string)dr["FirstName"] + " " + 
                dr["LastName"];
            int iEmployee = (int)dr["EmployeeID"];
            values.Add(new CascadingDropDownNameValue(
              sEmployee, iEmployee.ToString()));
        }
        return values.ToArray();
    }

Nótense los parámetros string knownCategoryValues, string category, éstos deben permanecer tal cual para que el control de CascadingDropDown haga con ellos su “magia”. La parte importante está después de List<CascadingDropDownNameValue>, que es la parte que construye los valores que finalmente llenan el DropDown de Employees. Se acomoda la presentación de lo que llevará el control y también el identificador del Employee que nos servirá para buscar las órdenes en el otro DropDown, de la siguiente manera:

    [WebMethod]
    public CascadingDropDownNameValue[] GetOrdersByEmployee(
      string knownCategoryValues,
      string category)
    {
        StringDictionary kv = CascadingDropDown.ParseKnownCategoryValuesString(knownCategoryValues);
        int iEmployee;
        if (!kv.ContainsKey("Employee") || !Int32.TryParse(kv["Employee"], out iEmployee))
        {
            return null;
        }

        SqlConnection connection = new 
            SqlConnection(@"Data Source=SERVER\SQLEXPRESS;
                Initial Catalog=Northwind;
                Integrated Security=True");

        SqlCommand command = 
		new SqlCommand("SELECT OrderID FROM Orders WHERE EmployeeID = " + iEmployee);

        command.Connection = connection;
        connection.Open();

        SqlDataAdapter adapter = new SqlDataAdapter(command);
        DataSet dataSet = new DataSet();

        adapter.Fill(dataSet);
        command.Connection.Close();

        DataTable tbl = dataSet.Tables[0];

        List<CascadingDropDownNameValue> values = new List<CascadingDropDownNameValue>();
        foreach (DataRow dr in tbl.Rows)
        {
            string sOrder = dr["OrderID"].ToString();
            int iOrder = (int)dr["OrderID"];
            values.Add(new CascadingDropDownNameValue(
              sOrder, iOrder.ToString()));
        }
        return values.ToArray();
    }

El WebMethod recibe como parámetro el EmployeeID dentro de knownCategoryValues y se hace una búsqueda del identificador con el cual filtramos la sentencia SQL para obtener las órdenes.

De igual forma, se prepara lo que alimentará el próximo DropDown en la última sección donde está el foreach. El WebMethod que prepara el detalle de las órdenes se filtra por el OrderID que se seleccione y se preparan los elementos para llenar el último dropdown. En el código descargable se podrá ver el código completo del webservice.

Configuración de propiedades

El código para que los CascadingDropDown trabajen se captura en la definición del control viendo la fuente HTML presionando la vista de Source:

Ver Source

Y las propiedades se deben llenar de la siguiente forma:

            <cc1:CascadingDropDown ID="CascadingDropDown1" runat="server">      
                <cc1:CascadingDropDownProperties Category="Employee" ParentControlID=""
                    PromptText="Select Employee" SelectedValue="" ServiceMethod="GetEmployees"
                    ServicePath="Northwind.asmx" TargetControlID="ddlEmployees" />
                <cc1:CascadingDropDownProperties Category="Order" ParentControlID="ddlEmployees"
                    PromptText="Select Order" SelectedValue="" ServiceMethod="GetOrdersByEmployee"
                    ServicePath="Northwind.asmx" TargetControlID="ddlOrders" />      
                <cc1:CascadingDropDownProperties Category="OrderDetail" ParentControlID="ddlOrders"
                    PromptText="Select OrderDetail" SelectedValue="" ServiceMethod="GetDetailsByOrder"
                    ServicePath="Northwind.asmx" TargetControlID="ddlOrderDetails" />
            </cc1:CascadingDropDown>

Las propiedades a tomar en consideración son ParentControlID que son para indicarle el DropDown en el que se basará el contenido del control especicado en TargetControlID. Con la propiedad ServicePath indicaremos el WebService que tiene los webMethods para alimentar el control y éste WebMethod se especifica en la propiedad ServiceMethod.

Una cosa más a considerar es que en las propiedades de la página debemos especificar que no habilite validación de eventos para que funcionen correctamente los controles. En la misma vista de Source al inicio del código deberá incluirse:

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs"
 Inherits="_Default" EnableEventValidation="false" %>

Después de esto, ya se puede ejecutar esta aplicación web y veremos que al entrar a esta página se alimentará el dropdown de Employee automáticamente. Y al seleccionar el Employee, se llenará y habilitará el siguiente control y pasará lo mismo con el que sigue.

Ver Source

Recursos:

Using the CascadingDropDown with a database
AtlasToolkit
Atlas


Espacios de nombres usados en el código de este artículo:

System;
System.Web;
System.Web.Services;
System.Web.Services.Protocols;
System.Data;
System.Data.SqlClient;
System.Collections;
System.Collections.Generic;
System.Collections.Specialized;
AtlasControlToolkit;

 


Fichero con el código de ejemplo: gflores_atlasCDDbd.zip - 5 KB

(MD5 checksum: [8E2615D4CDB2971903F5C4116AAAEF89])


ir al índice principal del Guille