AYUDA Agilizar y reducir código. VB.NET Framework 4.5

Iniciado por Torvic98, 2 Mayo 2014, 18:53 PM

0 Miembros y 1 Visitante están viendo este tema.

Torvic98

Hola, buenas a todos. Soy nuevo en el foro. Creo que me duda será fácil de resolver para muchos, pero yo como soy nuevo en esto del VB no consigo sacar la solución.  :huh:

La cuestión es que al iniciar un Form lleno de botones, necesito que se habiliten tantos botones como marque una variable definida en el anterior Form.

Bueno pues con la ayuda de mis escasos conocimientos he pensado en escribir esto:

Module Module1
   Dim botones As Integer
End Module

Public Class Form
   Private Sub Form_Load(sender As Object, e As EventArgs) Handles Me.Load
       'La variable botones tiene el valor que se le ha dado en el Form que llama a este otro Form.
       While botones <> 0
           If botones = 1 Then Button1.Enabled = True
           If botones = 2 Then Button2.Enabled = True
           If botones = 3 Then Button3.Enabled = True
           If botones = 4 Then Button4.Enabled = True
           If botones = 5 Then Button5.Enabled = True
           If botones = 6 Then Button6.Enabled = True
           'etcétera, etcétera...
           botones = Val(botones) - 1
       End While
   End Sub
End Class


Pero sería agotador tener que escribir tantas condiciones IF...ELSE como botones así que lo que os pido es una alternativa parecida a esto que he intentado yo, sin éxito, jajaja:

Private Sub Form_Load(sender As Object, e As EventArgs) Handles Me.Load
       'La variable botones tiene el valor que se le ha dado en el Form que llama a este otro Form.
       While botones <> 0
           Dim objetoboton As Object
           objetoboton = "Button" & botones
           objetoboton.Enable = True
           botones = Val(botones) - 1
       End While
   End Sub


Supongo que esto ultimo será un disparate, o algo así, pero no se me ocurre nada mejor. Jajaja  ;D

Si me podéis ayudar os lo agradecería mucho. Y si no os ha quedado claro preguntad y os lo intento explicar mejor.  :-\  

El Benjo

Puedes hacerlo mediante la colección de controles del Form. Es decir con "Me.Controls". Y compruebas si el control actual es un botton y si cumple otros requisistos que quieras comprobar. Te recomiendo que hagas esto sólo si son muchos botones. si no es así, continúa haciéndolo como lo tienes ahora.

Saludos.
www.es.neftis-ai.com

Sí hay un mejor lenguaje de programación y es ese con el que puedes desarrollar tus objetivos.

Eleкtro

#2
Una manera simple:

Código (vbnet) [Seleccionar]
   Private Sub Test()

       Dim Amount As Integer = -0I
       Dim Unknown As Object = " 5 "

       ' No uses el método 'Val()' para validar, es algo prehistórico ...de VB6.
       Integer.TryParse(Convert.ToString(Unknown).Trim, Amount)

       Dim Buttons As List(Of Button) =
           GetDynamicControls(Of Button)(Collection:=Me.Controls,
                                         NamePattern:="Button",
                                         NameRange:=Enumerable.Range(1, Amount)) ' From Button1 To Button5

       Buttons.ForEach(Sub(bt As Button) bt.Enabled = False)

   End Sub


...Utilizando este método de uso genérico, el cual no he optimizado muy bien y habrá formas más limpias de escribirlo, pero sirve.

Código (vbnet) [Seleccionar]
   ' Get Dynamic Controls
   ' ( By Elektro )
   '
   ''' <summary>
   ''' Gets a range of controls dinamycally by specifying the control's name pattern.
   '''
   ''' To use this method properly, the controls need to have a dynamic name.
   '''
   ''' Example:
   ''' 'Button1', 'Button2', 'Button3', etc..
   ''' Both has the same name and only differs the indexed number.
   '''
   ''' </summary>
   ''' <typeparam name="T"></typeparam>
   ''' <param name="Collection">Indicates the control collection where to find the controls.</param>
   ''' <param name="NamePattern">Indicates the name pattern of the controls.</param>
   ''' <param name="NameRange">Indicates the dynamic indexed pattern range.</param>
   ''' <returns>List(Of T).</returns>
   Private Function GetDynamicControls(Of T)(ByVal Collection As ControlCollection,
                                             ByVal NamePattern As String,
                                             ByVal NameRange As IEnumerable(Of Integer)) As List(Of T)

       If NameRange.Count < 1 Then Return Nothing

       Dim Controls As New List(Of T)

       For Each ctrl As T In Collection.OfType(Of T)()

           For Index As Integer = NameRange.Min To NameRange.Max

               If TryCast(ctrl, Control).Name.Equals(NamePattern & CStr(Index), StringComparison.OrdinalIgnoreCase) Then
                   Controls.Add(ctrl)
               End If

           Next Index

       Next ctrl

       Controls.Reverse() ' Sort them.

       Return Controls.ToList()

   End Function


Saludos