none
Como recorrer todos los botones de una aplicacion sin importar en que formulario se encuentre o equivalente...

    Pregunta

  • Hola, me interesa deshabilitar algunos botones o items específicos de acuerdo a una condición, no se si sea posible recorrer todos los formularios de mi aplicación a la vez, pero me gustaria algo de forma equivalente lo que sea que pueda resolverme el problema de lo que necesito, Acceder a cualquier botón sin importar en donde se encuentre.

    Renzo Rivera

    martes, 11 de abril de 2017 2:48

Respuestas

  • Salió una pregunta parecida en el foro hace algún tiempo. En aquél momento, la solución que propusimos fue la de agregar una clase heredando de Button, y usar en los formularios ese botón personalizado en sustitución del Button tradicional.

    Dentro del control personalizado se pueden hacer varias cosas. En aquella ocasión, lo que se hizo fue usar el constructor para suscribirlo a un evento estático global para toda la aplicación, de forma que al producirse la condición deseada lo que se hacía era disparar el evento, y todos los botones suscritos al evento cambiaban de estado. Otra opción sería que el botón se agregase a sí mismo a una lista estática global, de forma que una vez inicializados los formularios la lista contendría una referencia a todos los botones de la aplicación. De esa manera, recorriendo la lista, se puede cambiar su estado.

    • Marcado como respuesta Renzo19 jueves, 13 de abril de 2017 5:50
    martes, 11 de abril de 2017 6:36
  • No, no te falta el constructor. En VB.NET, el constructor es precisamente el Sub New que acabas de crear. Se ejecuta automáticamente cuando haces un "New" de la clase que lo contiene. Cuando ubiques un botón de este tipo en cualquiera de tus formularios, en el momento de presentar el formulario el código que lo presenta internamente tendrá que instanciar la clase y por lo tanto se ejecutará el Sub New. En consecuencia el botón quedará agregado a la lista global. Lo único que tienes que hacer es sustituir en todos tus formularios los Button que haya por MiBoton, cosa que funcionará sin problema dado que MiBoton hereda de Button.
    • Marcado como respuesta Renzo19 jueves, 13 de abril de 2017 5:50
    martes, 11 de abril de 2017 20:36
  • Primero, en algún sitio "global" declara la lista compartida. Yo prefiero usar una variable Shared dentro de una clase, pero en VB.NET también podría ser en un Module. Por ejemplo, supongamos que dentro de MiClase tienes esto:

    Public MisBotones as New List(Of Button)()

    Después, declaras la clase hija del botón, y en el constructor añades el "Me" a la lista:

    Public Class MiBoton
        Inherits Button
      Public Sub New
          MiClase.MisBotones.Add(Me)
      End Sub
    End Class

    • Marcado como respuesta Renzo19 jueves, 13 de abril de 2017 5:50
    martes, 11 de abril de 2017 6:49
  • La referencia de un miembro no compartido requiere una referencia de objeto.

    Perdon, error mio. Aunque te dije en el texto que la lista tenia que ser estatica, al escribir el ejemplo de codigo se me olvido incluir la palabra Shared en la declaracion de MisBotones, para convertir la variable en estatica en lugar de ser una variable de instancia (la cual, como bien dice el mensaje de error, requiere una referencia para poderla usar).

    Public Shared MisBotones as New List(Of Button)()

    • Propuesto como respuesta Joyce_ACModerator martes, 11 de abril de 2017 14:49
    • Marcado como respuesta Renzo19 jueves, 13 de abril de 2017 5:50
    martes, 11 de abril de 2017 10:55

Todas las respuestas

  • Salió una pregunta parecida en el foro hace algún tiempo. En aquél momento, la solución que propusimos fue la de agregar una clase heredando de Button, y usar en los formularios ese botón personalizado en sustitución del Button tradicional.

    Dentro del control personalizado se pueden hacer varias cosas. En aquella ocasión, lo que se hizo fue usar el constructor para suscribirlo a un evento estático global para toda la aplicación, de forma que al producirse la condición deseada lo que se hacía era disparar el evento, y todos los botones suscritos al evento cambiaban de estado. Otra opción sería que el botón se agregase a sí mismo a una lista estática global, de forma que una vez inicializados los formularios la lista contendría una referencia a todos los botones de la aplicación. De esa manera, recorriendo la lista, se puede cambiar su estado.

    • Marcado como respuesta Renzo19 jueves, 13 de abril de 2017 5:50
    martes, 11 de abril de 2017 6:36
  • Alberto Poblacion me gusto mucho tu respuesta, me encamino a lo que trato de conseguir pero quiero saber el segundo punto que dijiste. ¿Como puedo hacer para lograr que todos los botones de la aplicación aparezcan en una lista para luego recorrerla.?

    Renzo Rivera

    martes, 11 de abril de 2017 6:44
  • Primero, en algún sitio "global" declara la lista compartida. Yo prefiero usar una variable Shared dentro de una clase, pero en VB.NET también podría ser en un Module. Por ejemplo, supongamos que dentro de MiClase tienes esto:

    Public MisBotones as New List(Of Button)()

    Después, declaras la clase hija del botón, y en el constructor añades el "Me" a la lista:

    Public Class MiBoton
        Inherits Button
      Public Sub New
          MiClase.MisBotones.Add(Me)
      End Sub
    End Class

    • Marcado como respuesta Renzo19 jueves, 13 de abril de 2017 5:50
    martes, 11 de abril de 2017 6:49
  • Hola Alberto Poblacion no tengo muy claro donde tengo que pegar el código si es en el "Designer" o en una nueva clase.

    Lo que hice fue lo siguiente... Cree dos clases una llamada MiClase  la cual introduje este codigo: Public MisBotones as New List(Of Button)()

    y la segunda clase pegue el siguiente código:  pero creo que no era asi ya que me marco error diciendo: La referencia de un miembro no compartido requiere una referencia de objeto.

    Public Class MiBoton Inherits Button Public Sub New MiClase.MisBotones.Add(Me) End Sub End Class



    Renzo Rivera

    martes, 11 de abril de 2017 7:06
  • La referencia de un miembro no compartido requiere una referencia de objeto.

    Perdon, error mio. Aunque te dije en el texto que la lista tenia que ser estatica, al escribir el ejemplo de codigo se me olvido incluir la palabra Shared en la declaracion de MisBotones, para convertir la variable en estatica en lugar de ser una variable de instancia (la cual, como bien dice el mensaje de error, requiere una referencia para poderla usar).

    Public Shared MisBotones as New List(Of Button)()

    • Propuesto como respuesta Joyce_ACModerator martes, 11 de abril de 2017 14:49
    • Marcado como respuesta Renzo19 jueves, 13 de abril de 2017 5:50
    martes, 11 de abril de 2017 10:55
  • Alberto Poblacion Efectivamente ya no marca error, sin embargo donde tengo que pegar el codigo? actualmente hice 2 clases y en la segunda clase pegue el codigo que hereda del button pero mencionaste el constructor por lo que entiendo que me falta un paso a realizar. ¿Será que hay que pegar ese codigo en el "Designer" de cada form o como?

    Renzo Rivera

    martes, 11 de abril de 2017 19:18
  • No, no te falta el constructor. En VB.NET, el constructor es precisamente el Sub New que acabas de crear. Se ejecuta automáticamente cuando haces un "New" de la clase que lo contiene. Cuando ubiques un botón de este tipo en cualquiera de tus formularios, en el momento de presentar el formulario el código que lo presenta internamente tendrá que instanciar la clase y por lo tanto se ejecutará el Sub New. En consecuencia el botón quedará agregado a la lista global. Lo único que tienes que hacer es sustituir en todos tus formularios los Button que haya por MiBoton, cosa que funcionará sin problema dado que MiBoton hereda de Button.
    • Marcado como respuesta Renzo19 jueves, 13 de abril de 2017 5:50
    martes, 11 de abril de 2017 20:36