jueves, 27 de noviembre de 2008

WinForms. Controlar fin de carga de CrystalReportViewer

Tenemos un rpt que vamos a visualizar en un crystalReportViewer (crv) de nuestro WinForm. Y queremos controlar que mientras se monta el listado el usuario tenga un bonito reloj de arena dando vueltas en su pantalla. Parece sencillo:

Dim rpt As New CrystalDecisions.CrystalReports.Engine.ReportDocument

Me.Cursor = Cursors.WaitCursor
rpt.Load(rutaRpt, CrystalDecisions.Shared.OpenReportMethod.OpenReportByTempCopy)
rpt.SetDataSource(ds)
crv.ReportSource = rpt
Me.Cursor = Cursors.default

Al ejecutarlo nos damos cuenta de que en realidad el reloj de arena desaparece mucho antes de que el listado esté montado en la pantalla (obviamente esto sólo lo podemos apreciar si el listado es "pesado" de carga). Putada. Buscamos un evento que se nos dispare al terminar de armar el crystalReportViewer. Vaya, hay uno (AfterRender), pero sólo para el viewer de web. PUTADA de las gordas...

Pues si no hay solución elegante habrá que buscar una solución rastrera. ¿Y si intentamos paginar entre la asignación del ReportSource y la desaparición del reloj de arena?

Dim rpt As New CrystalDecisions.CrystalReports.Engine.ReportDocument

Me.Cursor = Cursors.WaitCursor
rpt.Load(rutaRpt, CrystalDecisions.Shared.OpenReportMethod.OpenReportByTempCopy)
rpt.SetDataSource(ds)
crv.ReportSource = rpt
crv.ShowFirstPage()
Me.Cursor = Cursors.default

Pues funciona. Menuda chorrada. Vamos a tomarnos unas cañas.

No hay comentarios: