martes, 22 de febrero de 2011

Limitar formatos de exportación en ReportViewer



Estimados lectores, ha sido una experiencia agradable el hacer este blog y tener algunos lectores que comparten el gusto por la programación; actualmente estoy empezando otro proyecto, muy personal,  con tecnología web  que espero compartir con toda la comunidad de programadores y necesito recursos porque es algo muy personal y mi situación financiera no es muy buena.

 Si alguien desearía apoyarme  tengo una tarjeta Oxxo Saldazo con el número:  4766-8408-7508-1593, cualquier apoyo lo pueden hacer en cualquier tienda Oxxo o en Banamex, les agradezco y que sus proyectos lleguen a buen fin.

Hola amigos, aqui les dejo una manera de limitar el número de formatos a exportar. En mi caso unicamente deseo que el usuario pueda exportar a PDF, deshabilitando la exportación a Excel y a Word
'primero debemos declarar estos imports en la página donde se encuentra el 'reportviewer
Imports Microsoft.Reporting.WebForms
Imports System.Reflection

'Después en la carga de la página ponemos la siguiente rutina
'barremos las extensiones de localreport, mi reportviewer se llama reportviewer1
For Each elemento As RenderingExtension In reportViewer1.LocalReport.ListRenderingExtensions
'ponemos la condición para entrar a poner falso la exportación a Excel y a Word
If elemento.Name = "Excel" Or elemento.Name = "WORD" Then
'traemos la información del campo con sus respectivos flags
Dim infCampo As FieldInfo = elemento.[GetType]().GetField("m_isVisible", BindingFlags.Instance Or BindingFlags.NonPublic)
'colocamos el valor de false a la extension
infCampo.SetValue(elemento, False)
End If
Next
'si conocen otra manera mas eficiente de hacer esto, no duden en compartirla

12 comentarios:

  1. Hola jimenez, he seguido tu ejemplo, para deshabilitar la exportacion en excel. Pero en la ultima linea de tu codigo infCampo.SetValue(elemento, False). Me muestra e; sgte error.

    Referencia a objeto no establecida como instancia de un objeto

    Agradeceria, me podrias apoyar en el error.


    José.

    ResponderEliminar
  2. Hola Josçe, si te fijas el error que te esta mandando es en elemento y el elemento(puede ser cualquier nombre) es un miembro de RenderingExtension. Lo que puede estar pasando es que no declaraste los imports o no los tienes declarados, o tambien pueda ser que yo tenga option strict off y tu tengas option strict on, aunque por lo general yo siempre ocupo option strict on, en fin, es complicado ver que error puede ser sin tener el codigo fuente a la mano, si me puedes enviar ese codigo a mi correo y yo lo intentare correr y probablemente sepamos la razon, este error significa que no has declarado la instancias de la clase, o sea que la clase esta pero la instancia no.
    saludos

    ResponderEliminar
  3. Hola, Muchas Gracias.... me sirvio mucho tu ejemplo, para el que le da el error, si trabaja con 2008 quitele el word solo lo deja con excel


    un abrazo
    Andres

    ResponderEliminar
  4. en C#

    foreach (RenderingExtension elemento in rptInforme.LocalReport.ListRenderingExtensions())
    {
    //ponemos la condición para entrar a poner falso la exportación a Excel y a Word
    if (elemento.Name == "Excel" | elemento.Name == "WORD")
    {
    //traemos la información del campo con sus respectivos flags
    FieldInfo infCampo = elemento.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic);
    //colocamos el valor de false a la extension
    infCampo.SetValue(elemento, false);
    }
    }

    ResponderEliminar
  5. Andres, muchas gracis por tu comentario y tu aportacion de la solucion en C, de esa manera nos retroalimentamos y aprendemos un poco mas cada dia, un saludo y suerte con tus proyectos

    ResponderEliminar
  6. Hola,

    el tema esta en que no se inicializa esta informacion:
    Dim infCampo As FieldInfo = elemento.[GetType]().GetField("m_isVisible", BindingFlags.Instance Or BindingFlags.NonPublic)
    Como si no reconociera la cadena "m_isVisible" que puede hacer falta?
    mil gracias.

    ResponderEliminar
  7. buenas tardes se que soy muy novata pero alguien me puede decir en que pagina colocar el código el que dice después de la carga de la pagina en el defaul en el web.config o en el report de ante mano muchas gracias por su gran colaboración...

    ResponderEliminar
  8. Gracias funciona perfecto en C#, gracias

    ResponderEliminar
    Respuestas
    1. Que bueno que te haya servido el ejemplo y la colaboración del amigo Andres Rarirez, gracias por comentar. saludos

      Eliminar
  9. efectivqmente si funciona comprobado yo lo puse en el init del reportview y funciono

    ResponderEliminar
  10. Respuestas
    1. Gracias por comentar Julio, que bueno que te haya servido
      Saludos

      Eliminar