How To: Sobreescribir el toolstrip del control ReportViewer.

Hace unos dias estaba terminando mi aplicación de informes para el proyecto de mi empresa. Entre uno de los requisitos estaba la exportación a Access. Como la barra de herramientas del ReportViewer no traia la exportación a Access tuve que crearme yo toda la funcionalidad para pillar los datos y crearla desde una clase.


Hasta ahí bien, tengo el dataset, las correspondencias de Sql Server y access y todo listo. Pero me faltaba algo, así es que despues de investirgar(google, codeproyect, ect) encontré un control en codeproyect que era básicamente el mismo que traia el ReportViewer pero con algunas limitaciones, asi es que no lo utilicé. Despues de probar y seguir buscando soluciones encontré la que comento ahora.


Lo que hice para ello es añadir un botón ToolStripDropDownButton mis opciones de exportación. Para ello implemnté las que ya traia por defecto(bueno, algunas de ellas no por cuestiones técnicas) y la de access.


Para ello me creé la función que me exporta un informe utilizando la funcionalidad que trae los servicios web de SSRS 2005 y añadí la nueva funcionalidad de access[…].
Lo siguiente que he hecho es crearme una propiedad que me de el ToolStrip que contiene el ReportViewer.







1
2
3
4
private ToolStrip ToolStrip
{
get { return this.BuscarToolStrip<ToolStrip>(this.reportViewer ); }
}


La función a la que llama es la siguiente y lo que hace básicamente es encontrar el ToolStrip dentro del control que nosotros le pasamos. En este caso el ReportViewer.

#region [BuscarToolStrip]
/// <summary>
/// Busca un tool strip en un control pasado.
/// </summary>
/// <typeparam name=”TClass”></typeparam>
/// <param name=”control”></param>
/// <returns></returns>
private TClass BuscarToolStrip<TClass>(Control control)
where TClass : System.Windows.Forms.Control
{

if (control == null)
return default(TClass);

else if (control is TClass)
return (TClass)control;

else
{

TClass result = default(TClass);
foreach (Control embedded in control.Controls)
{
if (result == null)
result = BuscarToolStrip<TClass>(embedded);
}
return result;
}
}
#endregion

Ya tengo la propiedad y la función necesaria para obtener mi ToolStrip, ahora solo queda implementarla y tratarla. Para ello creo una función que se ejecutará después del InitialiteComponent. Esta función se suscribirá al evento paint del ToolStrip.

#region [ConfigurarExportacion]
/// <summary>
/// Agrega un item de tipo ToolStripDropDownButton con las opciones de exportación.
/// </summary>
private void ConfigurarExportacion()
{
try
{
// Establezco el ToolStrip del ReportViewer
                // para trabajar con el.
ToolStrip toolStrip = this.ToolStrip;

if (toolStrip != null)
{
// Obtengo el menú de exportación.
ToolStripDropDownButton BotonExportar =
                    toolStrip.Items[“export”] 
                        as oolStripDropDownButton;                  

if (BotonExportar != null)
{
// Suscribo al evento paint a la barra
                        // ToolStrip del ReportViewer 
// para cargar el menú.

toolStrip.Paint +=
                     new PaintEventHandler(toolStrip_Paint);
}
}
}
catch (Exception ex)
{ }
}
#endregion

 


En el evento Paint del ToolStrip sustituiremos el botón export por uno propio. Este evento lo haremos solo una vez. La variable CrearMenu controlará la creación del botón de exportar. Cada botón del ToolStripDrownButton tendrá un texto y una imagen, y además de un evento.


#region [toolStrip (OnPaint)]


/// <summary>
/// Evento Paint de la barra ToolStrip del ReportViewer.
/// </summary>
/// <param name=”sender”></param>
/// <param name=”e”></param>
void toolStrip_Paint(object sender, PaintEventArgs e)
{
   if (this.CrearMenu)
      toolStrip = this.ToolStrip;

      if (toolStrip != null)
      {
        ToolStripDropDownButton BotonExportarIni =

       toolStrip.Items[“export”] as ToolStripDropDownButton;

ToolStripDropDownButton BotoExportar =
       new ToolStripDropDownButton(BotonExportarIni.Text, BotonExportarIni.Image); 

toolStrip.Items.Remove(BotonExportarIni);

BotonExportarIni = null;

// Inserto los items.
BotoExportar.DropDownItems.Add(“Exportar a Access”,
                                       this.imlInforme2.Images[“Access.png”], 
                                       this.ExportarInforme);

BotoExportar.DropDownItems.Add(“Exportar a Excell”,
                                       this.imlInforme2.Images[“Excell.png”], 
                                       this.ExportarInforme);

BotoExportar.DropDownItems.Add(“Exportar a PDF”,
                                       this.imlInforme2.Images[“PDF.png”], 
                                       this.ExportarInforme);

BotoExportar.DropDownItems.Add(“Exportar a HTML”,
                                       this.imlInforme2.Images[“HTML.png”], 
                                       this.ExportarInforme);

BotoExportar.DropDownItems.Add(“Exportar a XML”,
                                       this.imlInforme2.Images[“XML.png”], 
                                       this.ExportarInforme);

// Añado en la posición del item anterior el nuevo item.
toolStrip.Items.Insert(18, BotoExportar);

CrearMenu = false;
}
}
}


#endregion

 

Por ultimo decir que, el evento ExportarInforme tendrá dos parámetros: Object sender y EventArgs e. El sender.ToString() me dará el nombre del text que le puse al item y con ello según sea uno u otro, exportaré al formato suyo.


Esta es mi solución a el problema, no me gusta la idea de que cada vez que se pinte tenga que comprobar si hay que crear el menú o no, pero ya buscaré alguna solución, por ahora esta me vale. Si tenéis alguna sugerencia bienvenida es. Espero que os sirva de utilidad.


Un Saludo.

Sin categoría

24 thoughts on “How To: Sobreescribir el toolstrip del control ReportViewer.

  1. Fran no se si mi pregunta parezca básica pero como hago para cambiar y pre establecer los margenes y el tamaño del papel en un reporte utilizando el reportviewer???? de Visual Basic .net, el report viewer toma por defecto el tamaño A4 y yo quiero que tome el Letter o Tamaño carta. y preestablecer todos los margenes.??
    Ayuda desde Venezuela!!!!

    Gracias

  2. bueno mi email es ex-its@cantv.net de todos modos estare endiente al foro. Quiero hacer otra pregunta Yo diseñe una aplicacion en VB :net que lee una base de Datos Aceess como backend en un disco de red cuando enciendo el computador el sistema no puede ubicar la bd en el disco ya mapeado, si acceso el disco por el mi PC antes de correr la aplicacion noda el error pero si voy directo a la aplicacion da el error. Yo le hice una trampita ya que al inicio de la aplicacion invoco un call explorer.exe con el parametro del disco de red R: y asi la aplicacion lee la bd en ese disco pero creo que no es la manera mas apropiada,, se te ha presentado este problema????

  3. Hola Hugo,

    Puedes preestablecer los márgenes de tu informe cuando lo creas. Para acceder a estas propiedades debes de acceder al menú informe y seleccionar propiedades del informe. Este tiene una serie de pestañas con opciones. Selecciona la opción Diseño y ahí puedes cambiar los márgenes entre otras cosas. Si quieres que el informe sea de tipo carta debes de poner en ancho de página y alto de página las medidas necesarias de este tipo de papel. Aunque veas que algunas columnas o el ancho de la página no se ve bien cuando el control ReportViewer renderiza el informe no te preocupes que sale luego bien cuando imprimes. Te recomiendo que hagas pruebas con eso.

    En cuanto al problema de la base de datos de access, lo único que te puedo decir es que yo no lo tengo montado así. Si la aplicación te va bien perfecto. Si te recomendaría que lo montases en un SQL Server o en un Express(versión 2005 para ambos).

    Un Saludo

  4. Muchas Gracias pero me referia a hacerlo en tiempo de diseño, con codigo, de todos modos hare la prueba aver porque si me ocurre eso que tu describes.

  5. Si te refieres a lo del informe de tipo de carta, claro que puedes hacerlo!!. Una vez en el visual studio, te vas a explorador de soluciones y le das a ver código. Una vez en el código buscas estas dos etiquetas: 21cm y 29.7cm que en este caso está en a4 y vertical, pero puedes cambiarle los valores a tu gusto. Guardalo cuando termines y listo. Esto es para tenerlo por defecto en un tamaño predeterminado. Luego si quieres cambiar lo haces desde el ReportViewer.

    Espero que te sirva la ayuda.

    Un Saludo

  6. para usar todos los diferntes botones del report view como le hago no soy experto en eso.
    mi problema es que quiero pasar de un reporte a otro anterior y viceversa sin tener que llamar a la base de datos y volver a hacer el reporte.

  7. Hola Fran, tengo casi el mismo inconveniente de Hugo, el problema es que necesito imprimir un reporte en una hoja media carta pero de forma vertical, le he configurado el tamaño del reporte a 21.59cm – 14cm, y lo muestra bien en printpreview, pero cuando me imprime el reporte lo hace de forma horizontal, agradeceria la ayuda que me puedas brindar, gracias

    Alternar64@gmail.com

  8. Hola Isaac,

    Tan solo tienes que crearte dos botones para ello. Uno para ir al siguiente y otro para ir al anterior. Ahora te queda hacer una función que te controle en cual está y a donde tiene que ir en el siguiente paso(o el anterior). Si quieres saber los informes que hay en una carpeta determinada echa un vistazo al servicio Web que trae SSRS 2005 que viene un método para saber eso. Tienes más información acerca del servicio web en otro post que ya postee por aquí(http://geeks.ms/blogs/fdiaz/archive/2006/10/17/Exportando-un-informe-desde-Reporting-Services.aspx). Si despues de ver esto tienes más dudas vuelve a preguntarme .

    Espero que te sirva de ayuda.

    Un Saludo

  9. Hola Javier,

    Puedes hacer lo que ya explico más arriba o establecerlo en las propiedades del informe si trabajas con el ide de visual studio.net 2005. Creo que no debería de darte mayor problema.

    PD: Si quieres contactar conmigo hazlo desde la sección contacta de este blog. No te aconsejo que pongas tu dirección de correo en sitios públicos porque te puede llegar spam.

    Un Saludo

  10. hola, yo tambien requiero configurar el informe para imprimirlo, se trata de una matriz, en mi caso es dificil establecer el tamaño durante el diseño, ya que solo cuando se ejecuta tengo el tamaño del mismo(A4 o A3), no se si puedo hacerlo de alguna otra forma… yo lo exporto a pdf pero cuando se exporta lo hace en tamaño A4 y orientacion vertical y yo requiero que sea en orientacion horizontal, ya que al ser el ancho mayor al de una a4 divide la matriz en 2 paginas, repitiendo los grupos de las filas en la segunda pagina tambien y yo necesariamente necesito que salga la matriz entera… no se si puedes ayudarme con eso… Gracias

  11. Hola Olguita,

    Perdona por tardar tanto en contestar, a veces me pierdo con los comentarios(son muchos [:)]).
    He estado mirando y no se le pueden añadir parámetros. La única solución que le veo es que cuando sepas si es en a3 ó a4 lo modifiques en el XML del informe.

    Un Saludo

  12. Estimados amigos tengo un problema con la configuracion del tamano de pagina con el repotviewer, he creado un tamano de pagina personalizado y se lo he agregado a la impresora y lo he puesto por defecto el problema ocurre cuando quiero imprimir mi informe desde el report viewer , porq q no coger el tamano que le puse sino coge tamano carta, para poder imprimir en el tamano personalizado tengo que cambiarlo manualmente, me es raro q cuando voy a configuracion de pagina del reportviewer sale carta y si lo cambio al personalizado no me acepta el cambio y se queda en carta, lo q tengo q hacer es ir al boton de impresora, propiedades,avanzada y cambiar el tamano q deseo y despues imprimirlo, pero cuando quiero imprimir otro informe tengo que hacer lo mismo.. Alguien me puede ayudar?

  13. Hola Erick,

    Es así de jodió el controlillo, pero bueno, es la primera versión para Reporting Services. Esperemos que en próximas lo arreglen.

    Un Saludo

  14. Fran me puedes ayudar, tengo un informe, en el cual la informacion debe estar agrupada por idCliente, y al momento de imprimir si al final de la hoja no termina la informacion del cliente, la imprime en la pagina siguiente. Como hago? en Crystal habia una opcion para mantener junto el grupo tons imprimia al inicio de la siguiente hoja si no cabia en la primera

  15. Buenas, k tal oye tengo el problema con el ReportView pero es que quiero hacer la Class que tiene en C# pero en Visual Basic alguna forma…. esto es para cambiar los toolstrip del Reportview gracias.

  16. buenas, queria saber si el con el reportviewer se podia exportar a un documento de word o a un archivo de texto simple (.txt),
    gracias por la ayuda

  17. Hola Jose,

    Claro, para exportarlo a word puedes hacer varias cosas, currartelo a mano(yo no lo hice aún), comprar a un tercero

    algún paquete que lo haga, o utilizar la última versión de SSRS cuando salga(ahora mismo está en fase ctp, pero ya

    puedes utilizarla) [:D].
    Para exportar a texto, se me ocurre que busques el dataset, obtengas la sql y te crees por cada fila un registro en

    un archivo de texto. Todo esto lo empaquetas en una función y luego la llamas agregando un nuevo botón al

    ReportViewer.

    Espero que te sea de ayuda.

    Un Saludo

  18. estoy con ReportViewer, lo que necesitaria es poder imprimir (en lo posible 2 hojas del mismo reporte, es un presupuesto de ventas) sin mostrar el cuadro de dialogo, solo con apretar la tecla “imp pant”, es posible? o estoy desperdiciando el tiempo

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *