none
Combinar winforms con asp RRS feed

  • Pregunta

  • Hola a Todos, estoy desarrollando una aplicacion de escritorio c# de reservas hotelera, y tengo una necesidad de visualizar todas las reservas del mes (dias de mes en forma Horizontal) con la Habitaciones (Vertical), en un winforms me resulta demasiado extenso y quisiera saber si se puede combinar en una aplicacion de escritorio con una ventana en .asp; de que forma se haria y si tienen algun ejemplo de ayudaria bastante

    cmarin
    domingo, 14 de marzo de 2010 7:58

Respuestas

  • Hola,

    es un poquito complicado, dado que tendrías que simular un servidor web desde tu aplicación, o bien crearte un proyecto Web Application y copiar el código que ya tienes en tu winform. 

    Cuando yo tengo que hacer reportes suelo utilizar las alternativas que te propongo a continuación. 

    La primera es que generes un documento HTML al vuelo (puedes guardar dicho HTML en un MemoryStream o en un archivo temporal). En tu form, incrustas un control WebControl y le dices que navegue hacia el HTML y lixto, se visualiza como una página web (HTML) dentro de tu form. Por ejemplo: 

    // simulamos que estamos dentro de un Windows Form y que
    // hemos añadido un control WebBrowser.
    WebBrowser _browser;
    
    public Form1()
    {
        InitializeComponent();
        GeneraReporte();
    }
    
    public DataTable ObtenerDatos()
    {
        // esta sería la consulta SQL que harías para
        // obtener los datos de habitaciones, etc. 
    }
    
    public void GeneraReporte()
    {
        DataTable table = ObtenerDatos();
    
        StringBuilder html = new StringBuilder()
            .Append("<html><body>")
            .Append("<h1>Reporte</h1>")
            .Append("<table width='100%' border='0'>")
            .Append("<tr><th>Habitaci&oacute;n</th>")
            .Append("<th>Ocupado</th></tr>");
        foreach (DataRow row in table.Rows)
        {
            html.AppendFormat("<tr><td>{0}</td>", row["Habitacion"])
                .AppendFormat("<td>{0}</td></tr>", row["Ocupado"]);
        }
        html.Append("</table>")
            .Append("</body></html>");
    
        _browser.DocumentText = html.ToString();
    }

    La segunda alternativa es similar a la primera, solo que en lugar de generar un HTML generas un XML al que le adjuntas un XSL. De esta forma separas el archivo de datos de la presentación. Cuando puedo, suelo utilizar ésta última, sobre todo porque me permite cambiar el diseño del reporte sin tener que recompilar --basta cambiar el XSL. Como en este ejemplo

    Espero esto te sirva, ahí nos avisas. 

    Saludos. 


    Fernando Gómez
    fermasmas.wordpress.com
    domingo, 14 de marzo de 2010 8:55

Todas las respuestas

  • Hola,

    es un poquito complicado, dado que tendrías que simular un servidor web desde tu aplicación, o bien crearte un proyecto Web Application y copiar el código que ya tienes en tu winform. 

    Cuando yo tengo que hacer reportes suelo utilizar las alternativas que te propongo a continuación. 

    La primera es que generes un documento HTML al vuelo (puedes guardar dicho HTML en un MemoryStream o en un archivo temporal). En tu form, incrustas un control WebControl y le dices que navegue hacia el HTML y lixto, se visualiza como una página web (HTML) dentro de tu form. Por ejemplo: 

    // simulamos que estamos dentro de un Windows Form y que
    // hemos añadido un control WebBrowser.
    WebBrowser _browser;
    
    public Form1()
    {
        InitializeComponent();
        GeneraReporte();
    }
    
    public DataTable ObtenerDatos()
    {
        // esta sería la consulta SQL que harías para
        // obtener los datos de habitaciones, etc. 
    }
    
    public void GeneraReporte()
    {
        DataTable table = ObtenerDatos();
    
        StringBuilder html = new StringBuilder()
            .Append("<html><body>")
            .Append("<h1>Reporte</h1>")
            .Append("<table width='100%' border='0'>")
            .Append("<tr><th>Habitaci&oacute;n</th>")
            .Append("<th>Ocupado</th></tr>");
        foreach (DataRow row in table.Rows)
        {
            html.AppendFormat("<tr><td>{0}</td>", row["Habitacion"])
                .AppendFormat("<td>{0}</td></tr>", row["Ocupado"]);
        }
        html.Append("</table>")
            .Append("</body></html>");
    
        _browser.DocumentText = html.ToString();
    }

    La segunda alternativa es similar a la primera, solo que en lugar de generar un HTML generas un XML al que le adjuntas un XSL. De esta forma separas el archivo de datos de la presentación. Cuando puedo, suelo utilizar ésta última, sobre todo porque me permite cambiar el diseño del reporte sin tener que recompilar --basta cambiar el XSL. Como en este ejemplo

    Espero esto te sirva, ahí nos avisas. 

    Saludos. 


    Fernando Gómez
    fermasmas.wordpress.com
    domingo, 14 de marzo de 2010 8:55
  • Gracias Fernando lo pondre a prueba
    cmarin
    martes, 3 de enero de 2012 20:20