none
¿Es posible crear un delegado para todos los controles de un Form? RRS feed

  • Pregunta

  • Hola tengo un WinForm que recibe datos por UDP con varios TextBox y Label y necesito rellenar algunos TextBox dependiendo de lo que vaya recibiendo por UDP; el problema que estoy teniendo es clásico de acceso desde una Sub o Función a un control de la GUI.

    Tengo algunos delegados hechos para algunos controles, pero ahora la aplicación tiene mas de 100 controles ¿Debería hacer uno para cada control o se puede centralizar todo en un delegado?


    The Real Blue

    martes, 13 de mayo de 2014 13:54

Respuestas

  • Sí, el form y sus controles comparten el mismo thread.

    Puedes crear una única instancia del delegado. La función delegada puede ser un método del form con, digamos, parámetros de tipo Control y String, para saber cuál es el control y el texto a asignar (Text es una propiedad de Control, así que no necesitas especificar la subclase).

    Al delegado lo usas con el Invoke del form.

    Deberías probar, creo que no debería haber problemas.


    /dd

    miércoles, 14 de mayo de 2014 21:44

Todas las respuestas

  • Hola.

    Creo entender que lo que necesitas es acceder desde el servicio que recibe los datos UDP a los controles que están en el hilo GUI, ¿no?.

    ¿Por que no utilizas:  Application.CurrentDispatcher.Invoke(()=>{ // Lo que tengas que hacer con los controles;........}); ? (O BeginInvoke, en asíncrono).

    Espero te sirva de ayuda.

    Un saludo.

    martes, 13 de mayo de 2014 14:03
  • Tengo un Thread creado desde el WinForm que trabaja en segundo plano para no colgar la GUI, cuando el Threads captura algo llama a una Subrutina en el WinForm que procesa los datos recibidos, el problema es que desde esa Sub, aunque es parte del WinForm, no me permite acceder a los controles para cambiar su texto.

    Ya probé con un par de delegados para un par de controles y funciona Ok, pero tengo mas de 100 controles para "delegar" y quisiera saber si hay alguna forma de centralizar y manejar todos los TextBox desde un delegado.

    Nunca use lo que comentas, voy a ver si encuentro info al respecto; gracias por responder.


    The Real Blue

    martes, 13 de mayo de 2014 14:14
  • Hola:

     Ya estableciste:

    ¿Control.CheckForIllegalCrossThreadCalls Property?

    Con esto no necesitas delegados al menos no con controles comunes como el textbox, label, etc.


    Saludos desde Monterrey, Nuevo León, México!!!

    martes, 13 de mayo de 2014 15:19
  • Se acerca de esa propiedad, era lo que hacia en mis primeras aplicaciones en VB.NET pero no se si sea correcto usarlo, todavía no se si solo voy a cambiar el texto de esos controles desde una sola Sub o desde varias, el programa es bastante denso.

    Por eso estaba tratando de usar delegados o similares.


    The Real Blue

    martes, 13 de mayo de 2014 15:52
  • Hola.

    Con el CurrentDispatcher todo lo que se ejecuta se ejecuta en el hilo "GUI", por decirlo de alguna manera.

    Un saludo.

    martes, 13 de mayo de 2014 15:56
  • No lo logro hacer funcionar, lo puse adentro de la clase de la GUI justo después de

    Public Class Form1

    Y el IDE me dice que se esperaba una declaración, subrayando Application.

    ¿Tienes alguna pagina con algún ejemplo?

    Porque en MSDN no muestra mucha info, es muy escueta la información que hay.


    The Real Blue

    martes, 13 de mayo de 2014 17:54
  • Sí, el form y sus controles comparten el mismo thread.

    Puedes crear una única instancia del delegado. La función delegada puede ser un método del form con, digamos, parámetros de tipo Control y String, para saber cuál es el control y el texto a asignar (Text es una propiedad de Control, así que no necesitas especificar la subclase).

    Al delegado lo usas con el Invoke del form.

    Deberías probar, creo que no debería haber problemas.


    /dd

    miércoles, 14 de mayo de 2014 21:44