Utilizar SQL Server como origen de datos del control DataGrid de Silverlight

En un artículo de introducción al control DataGrid publicado anteriormente, vimos que para rellenar de datos este control se debe emplear un tipo que implemente la interfaz IEnumerable, lo que nos permite crear una colección List<MiClase>, donde MiClase representa cada uno de los objetos de la colección visualizada en las filas del control.

Dado que habitualmente la información con la que trabajamos se encuentra ubicada en bases de datos -SQL Server como ejemplo más representativo-, en este artículo explicaremos una técnica que nos permitirá conectarnos a la base de datos Northwind, y utilizar algunas de sus tablas como fuente de datos para el control DataGrid, empleando LINQ y servicios Web WCF como mecanismo para la obtención de los datos.

 

Creación del proyecto Silverlight

El primer paso, como es natural, consistirá en abrir Visual Studio 2008 y crear un nuevo proyecto de tipo Silverlight Application al que daremos el nombre SLDataGridSQL_CS  (en los siguientes enlaces se encuentran disponibles los proyectos en C# y VB). El asistente para la creación del proyecto nos pedirá entonces que indiquemos el tipo de entorno de pruebas dónde será alojado el contenido Silverlight que vamos a desarrollar, a lo que nosotros responderemos seleccionando un proyecto de tipo Web Application, como vemos en la siguiente figura.

Esta elección es muy importante, ya que este tipo de proyecto será el que nos ofrezca la posibilidad de definir un contexto de datos basado en LINQ, cosa que no ocurriría si eligiéramos, por ejemplo, la opción de utilizar un sitio Web como banco de pruebas.

Preparación del contexto de datos

La siguiente acción que llevaremos a cabo será la creación del origen de datos que conectará con la base de datos Northwind; para lo cual nos situaremos en la ventana Explorador de servidores, haremos clic derecho en el nodo Conexiones de datos y seleccionaremos la opción Agregar conexión; tras lo cual se abrirá la caja de diálogo mediante la que crearemos una conexión contra la base de datos ya mencionada, quedando expuestos sus elementos para una posterior selección.

Seguidamente, en la ventana Explorador de soluciones, nos situaremos en el proyecto Web, desde el cual definiremos el contexto de datos basado en LINQ.

Entre las diferentes variantes que LINQ ofrece para la obtención y manipulación de datos se encuentra LINQ to Classes, que está especialmente diseñada para interactuar con bases de datos SQL Server, y será la que emplearemos para obtener los registros de las tablas de Northwind.

Para añadir estas funcionalidades de LINQ a la aplicación haremos clic derecho sobre el proyecto Web y elegiremos la opción Agregar > Nuevo elemento, abriéndose a continuación la ventana Agregar nuevo elemento, desde la que seleccionaremos LINQ to SQL Classes para crear el contexto de datos, al que daremos el nombre DCNorthwind.

Pulsaremos Agregar para confirmar el anterior cuadro de diálogo, abriéndose a continuación el diseñador correspondiente al contexto de datos. Sobre este diseñador arrastraremos -desde la conexión contra Northwind creada en el Explorador de servidores– las tablas con las que vamos a trabajar.

Creando el canal de comunicación

El siguiente paso consiste en desarrollar el mecanismo para el transporte de los datos desde su punto de origen -las tablas de la base de datos-hasta el lugar de destino -el control DataGrid.

Para conseguir este objetivo emplearemos un servicio Web, que añadiremos al proyecto Web de la solución utilizando la opción WCF Service de la ventana Agregar nuevo elemento. Como nombre para el servicio usaremos WSDatos.

Antes de proseguir con el servicio Web volveremos un momento al diseñador de LINQ para realizar un pequeño ajuste. Debido a que los datos que manipularemos “viajarán” gracias al servicio Web, es preciso seriar dicha información, por lo que nos situaremos en la Ventana de propiedades del contexto de datos, asignando a la propiedad Serialization Mode el valor Unidirectional.

Regresando al servicio Web editaremos el archivo IWSDatos.cs, correspondiente a la interfaz del servicio y añadiremos la declaración de los métodos que devolverán las filas de las tablas de la base de datos.

// IWSDatos.cs
// ------------------    

[ServiceContract]
public interface IWSDatos
{
    [OperationContract]
    List<Shippers> ObtenerTablaShippers();

    [OperationContract]
    List<Products> ObtenerTablaProducts();
}

Como siguiente paso editaremos la clase WSDatos -que implementa la interfaz IWSDatos que acabamos de modificar- escribiendo los métodos que hemos declarado en la interfaz del servicio. Para facilitarnos la escritura de la declaración de dichos métodos, podemos hacer clic derecho en el nombre de la interfaz, seleccionando la opción Implementar interfaz, que creará los métodos vacíos.

El código a escribir en sendos métodos consistirá en crear una instancia del contexto de datos y una expresión LINQ para devolver la tabla correspondiente de la base de datos, que el método retornará en forma de colección.

public class WSDatos : IWSDatos
{
    #region Miembros de IWSDatos

    public List<Shippers> ObtenerTablaShippers()
    {
        DCNorthwindDataContext dcNorthwind = new DCNorthwindDataContext();
        var tblShippers = from tblShip
                          in dcNorthwind.Shippers
                          select tblShip;

        return tblShippers.ToList();        
    }

    public List<Products> ObtenerTablaProducts()
    {
        DCNorthwindDataContext dcNorthwind = new DCNorthwindDataContext();
        var tblProducts = from tblProd
                          in dcNorthwind.Products
                          select tblProd;

        return tblProducts.ToList();
    }

    #endregion
}

El servicio Web utiliza WSHttpBinding como tipo de enlace predeterminado, sin embargo, el enlace soportado por Silverlight es BasicHttpBinding. Esta circunstancia nos obliga a editar el archivo Web.config y modificar este valor, que se encuentra en el atributo binding del elemento endpoint, situado a su vez dentro del elemento service, como vemos a continuación.

<system.serviceModel>
<!--....-->   
<services>
 <service behaviorConfiguration="SLDataGridSQL_CS_Web.WSDatosBehavior"
  name="SLDataGridSQL_CS_Web.WSDatos">
  <endpoint address="" binding="basicHttpBinding" contract="SLDataGridSQL_CS_Web.IWSDatos">

Una vez terminadas estas operaciones habremos concluido el desarrollo del servicio Web, por lo que ahora pasaremos a diseñar la interfaz de usuario en Silverlight y su conexión con el servicio que le proporcionará los datos.

Creando la interfaz de usuario

Como acabamos de comentar nos situaremos en el proyecto Silverlight, más concretamente en su archivo Page.xaml, para diseñar la interfaz que emplearemos al ejecutar la aplicación.

En primer lugar quitaremos el panel Grid que por defecto incorpora la página, ya que en nuestro caso vamos a emplear paneles de tipo StackPanel, más concretamente añadiremos uno de estos paneles para contener todos los elementos, y otro anidado al primero, en el que incluiremos un TextBlock a modo de etiqueta y un ListBox con los nombres de las tablas a consultar. Finalmente agregaremos un DataGrid, que será el control visualizador de la tabla seleccionada desde el ListBox. A continuación podemos ver el código XAML resultante.

<UserControl xmlns:my="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="SLDataGridSQL_CS.Page"
    xmlns="http://schemas.microsoft.com/client/2007" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Width="600" Height="400">

    <StackPanel Background="LightYellow">
        <StackPanel Background="LightCyan" 
                    Margin="5" 
                    Height="100" 
                    Orientation="Horizontal" 
                    HorizontalAlignment="Center" >

            <TextBlock Text="Seleccionar tabla" 
                       VerticalAlignment="Center" 
                       Margin="10" />    
    
            <ListBox x:Name="lstTablas" 
                     Width="100" Height="75" 
                     Margin="10" 
                     HorizontalAlignment="Center" 
                     SelectionChanged="lstTablas_SelectionChanged">
                <ListBoxItem Content="Shippers" />
                <ListBoxItem Content="Products" />
            </ListBox>
        </StackPanel>

        <my:DataGrid x:Name="grdDatos" 
                     AutoGenerateColumns="True" 
                     Width="550" Height="250" 
                     Margin="5" />
    </StackPanel>
</UserControl>

Gracias a la combinación de paneles anidados y a las propiedades de orientación de los elementos dentro de dichos paneles, obtendremos un diseño como el que muestra la siguiente figura.

Comunicando con el servicio Web

El siguiente paso a realizar consistirá en conectar el proyecto Silverlight con el servicio Web creado en el proyecto Web, utilizando para ello una referencia hacia dicho servicio. Esta referencia la crearemos situándonos en el Explorador de soluciones, haciendo clic derecho en el nombre del proyecto Silverlight, y seleccionando la opción Agregar referencia de servicio.

Como consecuencia se abrirá la ventana para agregar la referencia, en la que pulsaremos sobre la flecha desplegable del botón Detectar, seleccionando la opción Servicios de la solución; acción esta que traerá al proyecto Silverlight la información del servicio WSDatos. Si desplegamos los elementos del servicio situado en el panel Servicios, llegaremos hasta su interfaz, pudiendo visualizar los métodos de que dispone en el panel Operaciones. El nombre que daremos a nuestra referencia será RefWSDatos, como vemos en la siguiente figura.

Una vez creada la referencia al servicio, solamente nos queda escribir el código para dotar de lógica a la página XAML.

El proceso a desarrollar consistirá en detectar la selección de una tabla mediante el evento SelectionChanged del ListBox. A continuación instanciaremos el servicio Web a través de la referencia -RefWSDatos.WSDatosClient- creada anteriormente, llamando después al método asíncrono que obtiene las filas de la tabla seleccionada. Dado que el mencionado método asíncrono no devuelve valor alguno, crearemos un manipulador de evento que será llamado cuando el método asíncrono finalice su ejecución; siendo en este manipulador donde realmente obtendremos los registros de la tabla en forma de colección, que asignaremos como fuente de datos al DataGrid. En el siguiente bloque de código podemos ver el code-behind de la página XAML.

public partial class Page : UserControl
{
    public Page()
    {
        InitializeComponent();
    }

    private void lstTablas_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        // instanciar el servicio Web
        RefWSDatos.WSDatosClient wsObtenerDatos = new SLDataGridSQL_CS.RefWSDatos.WSDatosClient();

        // comprobar el elemento seleccionado del ListBox
        // asociar el método manipulador del evento xxxCompleted
        // y llamar al método asíncrono que obtiene las filas de la tabla
        if (((ListBoxItem)this.lstTablas.SelectedItem).Content.ToString() == "Shippers")
        {
            wsObtenerDatos.ObtenerTablaShippersCompleted += new EventHandler<SLDataGridSQL_CS.RefWSDatos.ObtenerTablaShippersCompletedEventArgs>(wsObtenerDatos_ObtenerTablaShippersCompleted);
            wsObtenerDatos.ObtenerTablaShippersAsync();
        }
        else
        {
            wsObtenerDatos.ObtenerTablaProductsCompleted += new EventHandler<SLDataGridSQL_CS.RefWSDatos.ObtenerTablaProductsCompletedEventArgs>(wsObtenerDatos_ObtenerTablaProductsCompleted);
            wsObtenerDatos.ObtenerTablaProductsAsync();
        }
    }

    // los siguientes manipuladores de evento son llamados al finalizar
    // la ejecución del método asíncrono; en ellos se obtienen las filas
    // de la tabla en forma de colección, la cual es pasada al DataGrid
    // como fuente de datos
    void wsObtenerDatos_ObtenerTablaShippersCompleted(object sender, SLDataGridSQL_CS.RefWSDatos.ObtenerTablaShippersCompletedEventArgs e)
    {
        this.grdDatos.ItemsSource = e.Result;
    }

    void wsObtenerDatos_ObtenerTablaProductsCompleted(object sender, SLDataGridSQL_CS.RefWSDatos.ObtenerTablaProductsCompletedEventArgs e)
    {
        this.grdDatos.ItemsSource = e.Result;
    }
}

El resultado, en tiempo de ejecución, podemos apreciarlo en la siguiente figura, donde el DataGrid visualiza los registros de la tabla seleccionada.

Y con esto concluimos el presente artículo, que hemos dedicado a ilustrar el modo de conectar desde Silverlight con una base de datos SQL Server, para poblar un control DataGrid con una de sus tablas. Las técnicas aquí mostradas están basadas en la documentación de los siguientes enlaces publicados por Jesse Liberty y el Swiss MSDN Team Blog.

Espero que resulte de utilidad.

Un saludo.

50 Comentarios

  1. lmblanco

    Hola Enrique

    Muchas gracias por leerlo, me alegra que te haya gustado 8-D

    Un saludo.

  2. anonymous

    todo iba bien hasta que llegue a la comunicacion con el sericio WEB, detecta el servicio pero no veo los metodos

    el detalle del error empiezas asi:

    Error al descargar ‘http://localhost:1875/Service1.svc’.
    Error de la solicitud con el mensaje de error:



    No se encontró el tipo ‘sqlDataGridWeb.Service1’, proporcionado como el valor del atributo Service en la directiva ServiceHost.

  3. lmblanco

    Hola Manuel

    Revisa la interfaz del servicio, por si hubiera alguna discrepancia entre esta y el código del servicio. Comprueba también en el fichero web.config del proyecto asp.net, que el tipo de enlace está establecido a basicHttpBinding, en una etiqueta similar a la siguiente:

    Espero que localices el error.

    Un saludo.
    Luismi

  4. anonymous

    Amigo una pregunta y para ingresar datos tambien lo hago con los servicios ?? o con una capa de logica de nogocio BLL porque creo que aca solo usas el proyecto ASP y la interfaz Silverlight y no hay DAL ni Entidades que a veces uso en Silverlight se usan Niveles .. N Tiers ? o es que solo con el WCF vasta =O ?? esta muy bueno tu post y aprendi mucho, quisiera que me dijeras si hay algun patron de diseño, en verdad muchas gracias de antemano.

    PD: Aun no e leido los demas articulos voy a hecharle un ojo haber si aprendo mas.

  5. lmblanco

    Hola Jefferson, gracias por leer el post 😎

    Puedes, en efecto, utilizar servicios para el resto de operaciones con los datos (inserción, actualización y borrado) que manipulas en el DataGrid. Aunque esta parte del proceso de mantenimiento de una tabla de la base de datos es algo que se supone que van a facilitar en gran medida los ADO.NET Data Services, entidades, etc., podemos optar por utilizar servicios escribiendo nosotros toda el código del proceso del mantenimiento.

    A modo de ejemplo, intentaré en próximas fechas publicar un post con una muestra de esta técnica de trabajo.

    Un saludo.
    Luismi

  6. anonymous

    Como puedo buscar en el grid por columna?? tengo esto pero no me busca:

    If (tipo <> “”) Then
    If (bol = 1) Then
    sql = sql & ” and Tipo like ‘%” & tipo & “%'”
    Else
    sql = sql & ” where Tipo like ‘%” & tipo & “%'”
    bol = 1
    End If
    End If

  7. lmblanco

    Hola Jose

    Una vez que tengas el datagrid cargado con datos puedes utilizar una expresión LINQ sobre los datos contenidos en el datagrid para realizar la búsqueda de un registro en base a una determinada columna.

    Partiendo del ejemplo de este post, supongamos que vamos a buscar por la tabla Products, para ello añadimos al código xaml un textbox y un button:


    En el textbox introducimos un valor para buscar por el campo ProductName de la tabla Products, y al pulsar el botón, pasamos los datos del datagrid a una colección genérica (ObservableCollection), aplicando sobre la misma una expresión de consulta LINQ para buscar el dato introducido, el cual recuperamos y asignamos como elemento seleccionado al datagrid.

    private void btnBuscar_Click(object sender, RoutedEventArgs e)
    {
    System.Collections.ObjectModel.ObservableCollection lstProductos = (System.Collections.ObjectModel.ObservableCollection)this.grdDatos.ItemsSource;

    var UnProducto = from productos in lstProductos
    where productos.ProductName == this.txtValor.Text
    select productos;

    BuscarEnDataGrid.RefWSDatos.Products producto = UnProducto.Single();

    this.grdDatos.SelectedItem = producto;
    }

    Espero que te sirva de ayuda.

    Un saludo,
    Luismi

  8. anonymous

    SALUDOS.

    Muy bueno el ejemplo ilustrado en este post. Como comentario quería adicionar que haciendo aplicaciones para Silverlight, tuve el inconveniente de que me daba un error por una referencia de dominio cruzado (Silverlight 2 Beta 2) lo cual pude solucionar creando un servicio web Enabled Silverlight WCF lo cual crea un servicio a nivel de la aplicación asp.net, que consumirá la aplicación silverlight, mi duda es… ¿Existe un tipo deproyecto Enabled Silverlight WCF? Por que no funciona tan bien con un proyecto WCF Normal y solo con elementos WCF…

    Saludos
    Oscar Paredes C.

  9. lmblanco

    Hola Oscar

    Gracias por interesarte en el post 8-). Respecto a tu comentario, desconozco que exista un tipo de proyecto “Enabled Silverlight WCF”; sí que existe, una vez que ya has creado un proyecto Silverlight normal, la posibilidad de agregar un servicio WCF específico para una aplicación Silverlight, mediante el elemento “Silverlight enabled WCF Service”.

    Un saludo,
    Luismi

  10. anonymous

    Hola, solo una consulta.
    Tu obtienes los datos mediante un Servicio Web, puedo obtener los datos de otra forma?
    Gracias.Bendiciones.

  11. lmblanco

    Hola Jc3Band

    Debido a que el modelo de ejecución de Silverlight, por cuestiones de seguridad, se ejecuta en un sandbox, las técnicas de acceso a datos desde una aplicación Silverlight no pueden abordarse empleando los mecanismos de las aplicaciones Web tradicionales; es por esto, que la arquitectura de Silverlight ha sido diseñada para que el acceso a datos se realice a través de servicios, los cuales pueden ser los clásicos servicios Web ASMX, servicios WCF (que son el motivo de este post del blog), servicios REST y los servicios de datos de ADO.NET (conocidos inicialmente por su nombre clave Astoria).

    El acceso desde servicios WCF, como has podido ver en este post, resulta una buena aproximación a la manipulación de datos desde una aplicación Silverlight, no obstante ADO.NET Data Services es una tecnología que parece que llega con mucho empuje, por lo que espero en los próximos días, poder publicar algún post sobre su uso.

    Un saludo.
    Luismi

  12. anonymous

    Buenísimo! justo lo que andaba buscanco!

    no hay mucha documentación al respecto sobre como acceder a SQL server desde SilverLight.

    Ya estoy esperando el post del proceso de mantenimiento de una tabla de la base de datos.

    Gracias

  13. lmblanco

    Hola Dani

    Gracias por tu interés en el post y celebro que te haya gustado.

    Estoy liado con mil cosas y tengo pendiente desde hace tiempo escribir un post sobre las operaciones habituales de alta, baja y modificación sobre una base de datos desde Silverlight, pero espero poder hacer un hueco para publicar sobre estos aspectos, que parece resultan muy interesantes para todos.

    Un saludo.
    Luismi

  14. anonymous

    me podrian ayudar…yo hice la aplicacion tal como dice aqui y la ejecuto en visual studio y anda perfecto..
    Luego con el Publish…la llevo al wwwrootcarpeta donde le paso todos los archivos necesarios para ejecutar el iis
    el problema..es que muestra todo pero cuando tiene que ir a buscar los datos…no funciona y da un error…
    que es lo que me falta definir ???

    Gracias+

  15. lmblanco

    Hola Gustavo

    Es muy posible que te falte registrar la extensión xap en tu IIS. Te paso algunos enlaces que muestran cómo hacerlo. Espero que te sirvan de ayuda.

    http://www.85turns.com/2008/03/07/register-xap-file-in-iis/

    http://dolittle.com/blogs/einar/archive/2008/07/07/registering-xap-mime-type-in-iis-6-0.aspx

    http://blogs.msdn.com/silverlight_plus_java/archive/2008/08/28/tip-add-silverlight-mime-type-in-tomcat-and-iis-5-1.aspx

    Un saludo,
    Luismi

  16. anonymous

    ya he hecho el tema de poner en mime

    el tema es que aparentemente la aplicacion la ejecuta pero cuando va a buscar los datos tira este error:

    Unhandled Error in Silverlight 2 Aplication Exepcion durante la operacion. El resultado no es valido.
    Compruebe la exepcion

  17. lmblanco

    Hola Gustavo

    Quizá sea un problema con la cadena de conexión a la fuente de datos. En lugar de intentar enviar los datos de una tabla de la base de datos, prueba a enviar un dato simple, una cadena de caracteres por ejemplo, a ver si así te funciona. En caso de que sea así, repasa las operaciones que has realizado, ya que quizá te falte algún pequeño detalle por configurar.

    Un saludo,
    Luismi

  18. anonymous

    Webpage error details

    User Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729; OfficeLiveConnector.1.3; OfficeLivePatch.0.0)
    Timestamp: Thu, 30 Apr 2009 16:07:02 UTC

    Message: Unhandled Error in Silverlight 2 Application An exception occurred during the operation, making the result invalid. Check InnerException for exception details. at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()
    at SysTyronSl.Refwsmaster.ObtenerTablamastermCompletedEventArgs.get_Result()
    at SysTyronSl.slconsulta_master.wsobtenerdatosectores_tablasectorescompleted(Object sender, ObtenerTablamastermCompletedEventArgs e)
    at SysTyronSl.Refwsmaster.IwsmasterClient.OnObtenerTablamastermCompleted(Object state)
    Line: 1
    Char: 1
    Code: 0
    URI: http://scp015/sacorpren/scpaspsl/SysTyronSlTestPage.aspx

    Message: Unhandled Error in Silverlight 2 Application An exception occurred during the operation, making the result invalid. Check InnerException for exception details. at System.ComponentModel.AsyncCompletedEventArgs.RaiseExceptionIfNecessary()
    at SysTyronSl.Refwsmaster.ObtenerTablamastercCompletedEventArgs.get_Result()
    at SysTyronSl.slconsulta_master.wsobtenerdatosectores_tablausesioncompleted(Object sender, ObtenerTablamastercCompletedEventArgs e)
    at SysTyronSl.Refwsmaster.IwsmasterClient.OnObtenerTablamastercCompleted(Object state)
    Line: 1
    Char: 1
    Code: 0
    URI: http://scp015/sacorpren/scpaspsl/SysTyronSlTestPage.aspx

    me sale este error cuando publico,a q se debe, ya q ejecutandolo en vb2008 no hay problema, tu ayuda por favor. que hago

  19. anonymous

    realizando cada uno de los pasos da el siguiente error:
    Se ha producido un error al intentar realizar una solicitud al URI ‘http://localhost:49696/WSDatos/WSDatos.svc’. Puede deberse a un intento de acceso a un servicio de configuración entre dominios sin una política entre dominios adecuada en contexto o una política no apropiada para servicios SOAP. Es posible que necesite ponerse en contacto con el propietario del servicio para publicar un archivo de política entre dominios y para asegurarse de que permite enviar encabezados HTML relacionados con SOAP. Para obtener más información, consulte la excepción interna.

  20. lmblanco

    Hola Alex

    Si ejecutando desde Visual Studio 2008 no aparecen errores pero sí al publicar el proyecto, quizá necesites registrar la extensión XAP en IIS. Te adjunto un par de enlaces que quizá te sirvan de ayuda.

    http://www.85turns.com/2008/03/07/register-xap-file-in-iis/

    http://dolittle.com/blogs/einar/archive/2008/07/07/registering-xap-mime-type-in-iis-6-0.aspx

    Un saludo.
    Luismi

  21. anonymous

    Luismi:
    NO, me sale sin publicar en IIS, estoy usando aun el ASP NEt Developer server. Repeti los pasos y volvio a darme el error, estoy usando visual studio 2008.
    Aqui te mando un par de persona que han tenido ese mismo problema haciendo los pasos de este blog.
    http://silverlight.net/forums/t/83179.aspx
    http://silverlight.net/forums/t/57483.aspx

    gracias por su ayuda.

  22. anonymous

    Luis Miguel gracias x responder, ya probe registrar en iis pero nada q ver, no es eso, parece q FALTA ALGO mas en el codigo q pusistes, por que me da error en la parte del web service, al momento de llamar a las funciones para introducirse en la base de datos es ahi donde me sale este error, en el explorer, en firefox no me sale nada solo se estanca ahi como si estuviera buscando y ahi se queda…por favor tu ayuda para resolevr este inconveniente…ya q lo necesito para seguir con mi proyecto.

  23. lmblanco

    Hola Alex, Carlos Juan y Gustavo

    Por la descripción del error, parece que el principal problema es que se está realizando un acceso al servicio mediante llamadas entre dominios, faltando la configuración de una politica de seguridad para este particular.

    En este caso, es posible que el error pueda solucionarse añadiendo al proyecto en el que está alojado el servicio WCF (en este ejemplo, el proyecto Web) un fichero con el nombre clientaccesspolicy.xml, que contenga lo siguiente:

    < ?xml version="1.0" encoding="utf-8"?>







    Para un mayor detalle en lo que respecta a estos ficheros de configuración de politicas de acceso y seguridad, podéis consultar los siguientes enlaces:

    http://msdn.microsoft.com/en-us/library/cc197955(VS.95,printer).aspx

    http://msdn.microsoft.com/en-us/library/cc197940(VS.95,printer).aspx

    Espero que con esto podáis solucionar el problema.

    Un saludo,
    Luismi

  24. anonymous

    otra consulta..
    como hago para poner en un textbox el contenido de una row seleccionada en el datagrid ???

  25. anonymous

    en la ultima pantalla del ejemplo estas parado sobre el productId 58..como se hace para pasar ese parametro a un textbox o a una variable

  26. lmblanco

    Hola Gustavo

    Para conseguir esa funcionalidad que me comentas puedes utilizar el evento CurrentCellChanged del Datagrid. En primer lugar, añadimos el textbox al código xaml

    //————————


    //————————

    Y a continuación, en el code-behind de la página xaml, declaramos en el constructor de la página el evento para el DataGrid y escribimos en su manipulador el código que se encarga de obtener el elemento (fila) actualmente seleccionado en el grid, es decir, un objeto Shipper o Product y mostrar el valor de una de sus propiedades en el textbox. En este caso el código solamente se centra en el uso de objetos de tipo Product, pero con algunos retoques puedes adaptarlo para que funcione con ambos tipos de objetos.

    //————————
    public partial class Page : UserControl
    {
    public Page()
    {
    InitializeComponent();

    this.lstTablas.SelectionChanged += new SelectionChangedEventHandler(lstTablas_SelectionChanged);
    this.grdDatos.CurrentCellChanged += new EventHandler(grdDatos_CurrentCellChanged);
    }

    void grdDatos_CurrentCellChanged(object sender, EventArgs e)
    {
    RefWSDatos.Product oProduct = this.grdDatos.SelectedItem as RefWSDatos.Product;
    this.txtProducto.Text = oProduct.ProductName;
    }
    //….
    //————————

    Esto sería todo, espero que te sirva de ayuda.

    Un saludo.
    Luismi

  27. anonymous

    Muy buena la informacion

  28. lmblanco

    Hola José Luis

    Gracias por tu interés en el artículo, me alegra que te pueda resultar de ayuda.

    Un saludo.
    Luismi

  29. anonymous

    Hola, lei tu post y me parecio muy interesante y me ayudo mucho, soy estudiante de ing. de sistemas y llevo un curso llamado ing. web. Ahi nos han pedido que presentemos un trabajo de investigacion sobres las innovaciones con qu trabaja visual studio 2008, para ser exacto aspnet c#, y elegi silverligth. Mi pregunte es si en este ejemplo tambien se esta trabajando WCF para la comunicacion con la base de datos y que relacion tiene con silverligth, o que cosas mas puedo hacer con esas dos tecnologias, disculpe si aun no conozco esos temas pero estoy estudiando y me encanta la investigacion, ojala puedan ayudarme

  30. lmblanco

    Hola Alan

    Gracias por tu interés en el post. En efecto, en el ejemplo se utiliza un servicio WCF como canal de comunicación entre la interfaz de usuario desarrollada en Silverlight y la fuente de datos, que es una tabla de una base de datos SQL Server. En los siguientes enlaces tienes algunos ejemplos adicionales del uso de servicios WCF en Silverlight, espero que te sirvan de ayuda.

    http://geeks.ms/blogs/mredison/archive/2008/05/16/tutorial_2D00_de_2D00_silverlight_2D00_2_2D00_con_2D00_wcf.aspx

    http://msmvps.com/blogs/luisabreu/archive/2007/06/12/calling-a-wcf-service-from-your-silverlight-application.aspx

    http://www.netfxharmonics.com/2008/11/Understanding-WCF-Services-in-Silverlight-2

    Un saludo.
    Luismi

  31. anonymous

    Hola, muy bueno tu artículo! felicidades.
    estoy trabajando una versión en visual basic del mismó ejemplo que tienes. de forma local, todo perfecto.. con el web developer 2008 express. pero al momento de intentar montarlo en windows server 2003, con cualquier IIS, mi servicio no funciona correctamente. manda el siguiente error:

    The type ‘Grid.Web.Service1’, provided as the Service attribute value in the ServiceHost directive could not be found.

    Gracias de antemano.

  32. anonymous

    Hola, este muy bien el articulo, lástima que yo utilice vb y me ha costado un poco traducirlo pero lo logre jaja…

    Al grano, cuando llego a la parte de Agregar la referencia de Servicio no me deja, me lo detecta y todo bien, pero al darle a aceptar me dice que ha habido el siguiente error:

    No se encontró el nombre del contrato ‘Silverlight_Omega.Web.IOmega_SQL’ en la lista de contratos que implementa el servicio ‘Omega_SQL’

    Que puedo hacer?? se te ocurre alguna solucion?? Puede ser por tema de nombre de tablas o algo asi??

    Gracias….

  33. lmblanco

    Hola Óscar

    Gracias por tu opinión, respecto al lenguaje de los ejemplos, al comienzo del artículo existen dos enlaces para poder descargar el proyecto en ambos lenguajes: C# y VB.

    En cuanto al problema que mencionas, quizá pudiera ser debido a los espacios de nombre de los proyectos que contienen la aplicación web y el proyecto Silverlight. Revísalos a ver si fuera este el motivo. Prueba a desarrollar el ejemplo que se comenta en el artículo, utilizando los mismos nombres, a ver si de esta manera te funcionara y de esa forma pudieras localizar el origen del problema.

    Un saludo.
    Luismi

  34. anonymous

    Gracias por el artículo. Me es muy útil.
    Mi pregunta está referida al momento en el cual, una vez terminada la aplicación, la tenga que subir al servidor.
    Cuando se establece la conexión al servidor mediante el “explorador de servidores”, se utiliza una base de datos local.
    Pero cuando publique el desarrollo en el servidor remoto, supongo que habría que cambiar “connectionString”.
    Veo que en archivo “Web.config” se establece automáticamente lo siguiente:



    Con solo cambiar allí la “connectionString” será suficiente ? O el servicio de conexión a la base necesita mas parámetros ?

    Un saludo,
    José

  35. lmblanco

    Hola Jose

    En teoría debería ser suficiente con cambiar el valor de la propiedad connectionString.

    Un saludo,
    Luismi

  36. anonymous

    El control my:DataGrid de que libreria lo obtienes???????

  37. lmblanco

    Hola Edi-Lo

    Ese control está en el espacio de nombres System.Windows.Controls, el ensamblado que lo contiene es System.Windows.Controls.Data.

    Un saludo.
    Luismi

  38. anonymous

    Error al descargar ‘http://localhost:1083/WSDatos.svc’.
    Error de la solicitud con el mensaje de error:



    Error de configuración

  39. anonymous

    Hola Foro una pregunta estoy filtrando un dato a traves del siguiente query me da un error

    var contactoLuis = (from c in bdmia.misdatos
    where (string)c.data.Descendants(“Filial”).Attributes(“Nombre”).First().Value.ToString() == “Italcambio,C.A.”
    select c);

    bdmia es el datacontext de linq que mapea a la base de datos en sql
    misdatos es una tabla del contexto de dato

    la tabla tiene un campo id que es int y un campo data que es un xml

  40. anonymous

    Hola Luis Miguel,

    Si creo el proyecto desde 0 con lo mismo que has mencionado en el artículo con VS2010 Silverlight 4 y SQL Server 2008 ¿Funcionaría igual?

    Gracias por tu post!

    Saludos!

  41. anonymous

    Lo decía porque actualmente no me funciona 🙂

  42. lmblanco

    Hola Carmen

    Gracias por tu interés en el post y disculpa el retraso en la respuesta.

    Acabo de hacer la prueba que me comentas desde VS2010 y me ha funcionado correctamente. La única diferencia que yo he observado en la prueba que acabo de realizar con respecto al texto del post, es que no he necesitado modificar el web.config para asignar el valor basicHttpBinding al atributo endpoint. De hecho, estas etiquetas y atributos que menciono en el post no aparecen en el web.config que he creado desde VS2010, por lo que sin modificar el web.config me ha funcionado bien el ejemplo.

    Un saludo,
    Luismi

  43. anonymous

    Excelente tutorial muy completo abarca muchas tecnologias Saludos!

  44. lmblanco

    Hola Arturo

    Muchas gracias por leer el post y por tu opinión. Celebro que te haya gustado 🙂

    Un saludo,
    Luismi

  45. anonymous

    Bueno viendo tu última respuesta creo que no es tan tarde para preguntar. Primero decirte que está muy bien tu post, yo lo he utilizado con VS2010 y Silverlight 4 y si me pidió la configuración en el web.config aunque no era error solo advertencia pero lo hice.

    Al correrlo en el Visual no me da ningún problema, pero cuando lo publico hacia mi servidor es cuando no funciona bien, no me da ningún error, solo que no hace la consulta y checando bien, parece como si no ejecutara la llamada al método completed, que es donde trae los resultados (e) porque ahí mando un mesaje para probar pero nunca llega.

    Ya hice el archivo XML que dice y lo de los mimes ya estan configurados, pero sigue dando ese problema al acceder desde internet.

    Saludos espero tu ayuda si tienes alguna sugerencia, muchas gracias.

  46. lmblanco

    Hola Ramón

    Gracias por tu interés en el post, y respecto al problema que comentas, puede que sea alguna cuestión en la configuración de despliegue del proyecto. Te paso un enlace sobre este tema que espero te sea de ayuda.

    http://forums.silverlight.net/forums/p/1787/203871.aspx

    Un saludo,
    Luismi

  47. anonymous

    hola que buen ejemplo me salvaste de verdad no entendia nada de wcf y silverlight pero ahora con este ejemplo se me hara mas facil trabajar asi!!! 🙂 muy bueno

  48. lmblanco

    Hola Mariel

    Muchas gracias por tu interés en el post, y celebro que te haya resultado útil.

    Un saludo,
    Luismi

  49. anonymous

    Hola esta muy bien el ejemplo, yo quiero en lazar los elementos de la tabla categorias a un combobox y una vez seleccionado el elemento que en el datagrid me muestre los productos de dicha categora seleccionada…

    Me podrian ayudar por favor

  50. lmblanco

    Hola Jesús

    Puedes utilizar el control DataForm como soporte, donde puedes cargar una colección de entidades, y configurar el campo que necesites para que se muestre en un combobox. Revisa la siguiente serie de artículos, con un poco de trabajo adicional podrás enlazar la selección de un combobox para que se muestren los valores relacionados en un datagrid.

    http://geeks.ms/blogs/lmblanco/archive/2011/01/23/mejorando-la-experiencia-de-usuario-en-el-control-dataform-de-silverlight-1.aspx

    Un saludo,
    Luismi

Leave a Reply

Tema creado por Anders Norén