Mostrando entradas con la etiqueta winforms. Mostrar todas las entradas
Mostrando entradas con la etiqueta winforms. Mostrar todas las entradas

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.

miércoles, 21 de mayo de 2008

WinForms. Ocultar TabPage de un TabControl

Con lo fácil que sería que cada TabPage tuviese una propiedad "visible". Pues no.

Para ocultar un TabPage:

TabPage.Parent = nothing


Para volverlo a mostrar:
TabPage.Parent = TabControl


Hale!

domingo, 24 de febrero de 2008

Winforms. Poner un ComboBox en modo "sólo lectura"

Una de winforms.

Ante la inexistencia de una propiedad ReadOnly en el ComboBox, análoga al del TextBox, la única solución para bloquear la entrada de un usuario en un combo es usar el enabled=false, lo que provoca efectivamente que el control no admita entradas pero que tampoco admita ser leído con claridad. Que al ponerse gris no se ve una mierda, vaya.

Pues nada, a montarse una pajilla mental de cómo simular el ReadOnly del TextBox en un ComboBox:

Private Sub proteger()
  ComboBox1.DropDownStyle = ComboBoxStyle.Simple
  AddHandler ComboBox1.KeyDown, AddressOf Me.DesactivarTeclas
End Sub

Private Sub desproteger()
    ComboBox1.DropDownStyle = ComboBoxStyle.DropDownList
    RemoveHandler ComboBox1.KeyDown, AddressOf Me.DesactivarTeclas
End Sub

Private Sub DesactivarTeclas(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyEventArgs)
    e.SuppressKeyPress = True
End Sub


Cuidado si en el formulario hay eventos asociados a la pulsación de teclas, caso en el que habría que personalizar la aplicación del suppressKeyPress en el procedimiento DesactivarTeclas.