Saltar al contenido principal

 none
Error cuando intento acceder a un control de otro formulario C#(WPF) RRS feed

  • Pregunta

  • El problema que tengo es que me aparece error cuando intento acceder a un control de otro formulario desde el mio aqui esta el error y mi codigo.

    Como llamo al control que quiero acceder

    Error cuando intenta acceder al otro control


    de mi parte es todo espero puedan ayudarme a resolver este pequeño dilema, un cordial saludo

    lunes, 17 de diciembre de 2018 5:33

Respuestas

  • Para acceder a un control de una ventana desde cualquier otro sitio que no sea la misma ventana, hay que conservar una referencia a la instancia de la ventana que contiene el control. Para ello tienes que retroceder al sitio en el que se abrió la ventana por primera vez y ver qué variable utilizaste para contener la instancia de esa ventana en el momento de abrirla. Esa variable hay que guardarla; si usas una variable local y dejas que se pierda, entonces pierdes el acceso directo a esa ventana. Pero si guardas la variable, entonces usando variable.NombreDelControl puedes acceder al control deseado (suponiendo que sea público dentro de la clase que lo contiene).
    • Marcado como respuesta Christian CJ miércoles, 26 de diciembre de 2018 23:45
    martes, 18 de diciembre de 2018 19:56
    Moderador

Todas las respuestas

  • A la vista del error que sale, casi seguro que es porque se te ha olvidado inicializar la propiedad BasePrincipal (o la inicializas en otro sitio y no has pasado por él antes de llegar al sitio donde te da el error).

    Fíjate que en el código que has puesto solo se ve dónde declaras la propiedad, pero no has mostrado el sitio donde le asignas la instancia correspondiente:

    BasePrincipal = new ProgramaBase();

    Ojo, no hagas ese new arbitrariamente en cualquier sitio. Eso crearía un NUEVO ProgramaBase. Asegúrate de que apuntas tu variable a la instancia auténtica que quieres usar, no a una nueva instancia.

    lunes, 17 de diciembre de 2018 7:48
    Moderador
  • hola

    estas implementnado WPF, no te comunicas entre forms de esa forma, sino que implementas patrones como ser el Publish/Subscriber

    El MainViewModel expone un eventos (en tu caso para actualizar el statusbar), y quienes quieran informar de un cambio simplemente lanza el mismo evento respectando la firma y enviando lo argumentos.

    De esta forma desacoplas la comunicación.

    Communication Between Views in MVVM (Pub-Sub Pattern)

    Si aplicas alguna librería estas incluyen este concepto como ser el MVVM Light’s Messenger or Microsoft Prism’s EventAggregator.

    Communication between ViewModels with MVVM

    Se que quizas en tu caso no implementas el patron MVVM, pero la forma de comunicar deberia ser igual

    saldos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 17 de diciembre de 2018 10:52
  • Alberto Poblacion gracias por contestar y referente a tu pregunta es el primer form que se inicializa y despues sale la ventana donde quiero utilizar el control, lo que no entiendo es porque no lo lee cuando el formulario ya está iniciado
    martes, 18 de diciembre de 2018 19:20
  • Leandro Tuttini gracias por contestar pero no logro comprender como esta conformado el ejemplo que das en las páginas que proporcionas, cómo podría utilizar un control de otro formulario?, saludos
    martes, 18 de diciembre de 2018 19:25
  • lo que no entiendo es porque no lo lee cuando el formulario ya está iniciado

    Probablemente tu error está en el uso de la palabra "el" en la frase anterior. Aparentemente piensas que un formulario es único, y que una vez que has declarado su clase y has creado una instancia, esa misma instancia es accesible desde cualquier sitio donde declares una variable de la misma clase. No es así, se comporta como cualquier otra clase, es decir, puede haber múltiples instancias de la misma clase y en cualquier sitio donde quieras leer datos de una de las instancias necesitas usar una referencia a esa instancia, tomada en el momento en el que la instancia fue inicializada. No vale con declarar una nueva referencia en otro sitio, y no inicializarla con ninguna instancia, y esperar que a través de ella se vean los datos de la otra instancia que antes se inicializó.

    Pero en todo lo anterior, nada tiene que ver el hecho de que se trate de un formulario. Es un concepto básico en programación orientada a objetos, y te ocurriría exactamente lo mismo si estuvieras manejando cualquier otra clase de cualquier tipo, aunque la clase no represente un formulario.

    martes, 18 de diciembre de 2018 19:28
    Moderador
  • Alberto Poblacion gracias por responder nuevamente, entonces por lo que me comentas al momento de querer acceder a un control de otra venta aunque esté abierto al leerlo me sale como si no estuviera iniciado por los mismo que son diferentes clases pero entonces cómo podría acceder a un control desde otra venta? o como podría colocar el código sin que me de ningun error    
    martes, 18 de diciembre de 2018 19:36
  • Para acceder a un control de una ventana desde cualquier otro sitio que no sea la misma ventana, hay que conservar una referencia a la instancia de la ventana que contiene el control. Para ello tienes que retroceder al sitio en el que se abrió la ventana por primera vez y ver qué variable utilizaste para contener la instancia de esa ventana en el momento de abrirla. Esa variable hay que guardarla; si usas una variable local y dejas que se pierda, entonces pierdes el acceso directo a esa ventana. Pero si guardas la variable, entonces usando variable.NombreDelControl puedes acceder al control deseado (suponiendo que sea público dentro de la clase que lo contiene).
    • Marcado como respuesta Christian CJ miércoles, 26 de diciembre de 2018 23:45
    martes, 18 de diciembre de 2018 19:56
    Moderador