14 oct 2009

Como acceder a la propiedad Text de un control NumericUpDown

Problema con NumericUpDown y la propiedad Text

Hoy me encontré con un problemita trabajando sobre un formulario que contiene varios NumericUpDown. El tema es que se podía seleccionar un valor, luego borrarlo y el sistema no hacía una validación que indicara al usuario que debía introducir un valor.

Al empezar a hacer pruebas noté que el texto queda vacío, pero el valor no cambia, o sea que si el NumericUpDown tiene un valor de 75 y le borramos el texto, al acceder a la propiedad Value del mismo, ésta nos devuelve 75.

El problema para solucionar ese bug me lo encontré cuando intenté acceder a la propiedad Text, para chequear que la misma no contenga un String vacío... Oh sorpresa, no se puede acceder a esa propiedad porque es privada!!

Para acceder a la propiedad Text aprovecharemos de la herencia de esta clase, NumericUpDown es una subclase de Control, entonces al hacer un cast podemos acceder a la propiedad Text para hacer el chequeo.
Esto nos permite varias soluciones posibles, una que me pareció bastante elegante fue asignar un event handler, o manejador de eventos al evento TextChanged, al cual también accederemos mediante un cast a Control.


Solución:


Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
For Each c As Control In Me.Controls
If TypeOf c Is NumericUpDown Then
AddHandler c.TextChanged, AddressOf NumericUpDownControls_TextChanged
End If
Next
End Sub

Private Sub NumericUpDownControls_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
If CType(sender, Control).Text = String.Empty Then
CType(sender, Control).Text = CType(sender, NumericUpDown).Value.ToString()
End If
End Sub



Otra posible solución, más eficiente desde el punto de vista de reusabilidad sería crear un control que herede de NumericUpDown y ya implemente de por si este comportamiento; que a mi entender es una falta de parte del equipo que desarrolló el control.

3 comentarios:

  1. Hola compa... mira soy un programador muy desactualizado que alguna vez programa en visual basic y ahora que he querido retomar camino leo que ahora ya se usa .NET y descubro que me he quedado medio obsoleto. antes me bastaba buscar en algun torrent el visual b asic 6 que es el que yo use en mis años maravillosos ahora tu me podrias dar una pista de donde puedo encontrara una copia del visual studio .net 2003 o 2005 te lo agradeceria para volver a empezar.

    ResponderEliminar
  2. no me la sabia que con ese delegado ...ya lo adpte a mi codigo , tenia dos "nud" uno actualizaba al otro pero solo tenia el evento valuechanged...osea me servia a medias...pero con esta solucion, mi implementacion ta quedando brava...se agradece.

    ResponderEliminar
  3. Perdón por la demora en la respuesta.

    chiko, es ilegal descargar una copia del .net pero busca las versiones Express en el sitio de Microsoft, tienen algunas limitaciones pero son gratuitas.

    leffty, me alegro de que sea útil.

    ResponderEliminar