none
Form Mdi e Hijos RRS feed

  • Pregunta

  • Tengo un Form MDI, dentro del cual se pueden mostrar varios Form Hijos.

    Frente a este planteo quiero preguntar si es posible hacer que uno de los formularios Hijos se mantenga siempre detrás de todos los form abiertos, ante cualquier cambio de foco de los Form abiertos.

    Es decir, el form1(Hijo) contiene botones que abren otros form Hijos (2 ó 3), y quisiera que al cambiar de un formulario a otro, ninguno se ubique detrás del Form1.

    ¿Es esto posible?

    (Espero haber sido claro en la pregunta)

    martes, 28 de julio de 2015 3:13

Respuestas

  • Debes tener el objeto al que quieres controlar perfectamente identificado, ya sea declararlo como variable global o en alguna lista, esto debido a que no puedes mantenerlo atrás siempre sino que debes agregar código para que en el evento activated del formulario, el que quieres mandar al fondo se valla para atrás.

    Este código te envía un form siempre al fondo

                Form1 objForm = new Form1();
                objForm.Show();
                objForm.SendToBack();

    Bueno a cada formulario le vas a crear una propiedad de tipo Form en donde guardaras la referencia del formulario que vas a mandar hacia atrás.

    public Form formulario;

    cuando crees el objeto form, también pasa el form del original para poder llegar a el.

    y cada que llames el método activated, invoca el sendtoback para que el formulario siempre este atras

    saludos


    Ing. Carlos Monroy MCP, MCAD, MCSD, MCTS

    martes, 28 de julio de 2015 14:19
  • Lo que podrías hacer es no permitir que el formulario que quieres en segundo plano se active hasta que se hayan cerrado el resto:

        Private Sub MDIForm_MdiChildActivate(sender As Object, e As EventArgs) Handles MyBase.MdiChildActivate
            If TypeOf (ActiveMdiChild) Is Form1 Then
                Dim formFront As Form = MdiChildren.FirstOrDefault(Function(f) Not TypeOf f Is Form1)
                If Not formFront Is Nothing Then
                    formFront.Activate()
                End If
            End If
        End Sub
    Reemplaza Form1 por el nombre de tu formulario.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 28 de julio de 2015 14:17

Todas las respuestas

  • hola

    >>Frente a este planteo quiero preguntar si es posible hacer que uno de los formularios Hijos se mantenga siempre detrás de todos los form abiertos, ante cualquier cambio de foco de los Form abiertos.

    si todos los form son hijos estan al mismo nivel dentro del contenedor padre, por lo que no hay logica que se pueda usar para poner uno detras del resto

    podrias hacer que los forms hijos 2 y 3 no sean mdi child sino que se muestren como modal usando el ShowDialog() de esta forma si se verian simpre en primer plano

    pero por supuesto ya no estarian dentro del contenedor mdi

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    martes, 28 de julio de 2015 3:56
  • Agrego que he intentado poner los controles del form que pretendo mantener detras, directamente en el Form MDI para evitar usar ese hijo que deseo mantener detras.

    Pero al pasar cambiar foco de una Form a otra, el Form que queda en segundo plano, se ubica incluso por detras de los botones y/o cuadros de texto, etc que contiene el MDI .....?????

    martes, 28 de julio de 2015 13:45
  • Lo que podrías hacer es no permitir que el formulario que quieres en segundo plano se active hasta que se hayan cerrado el resto:

        Private Sub MDIForm_MdiChildActivate(sender As Object, e As EventArgs) Handles MyBase.MdiChildActivate
            If TypeOf (ActiveMdiChild) Is Form1 Then
                Dim formFront As Form = MdiChildren.FirstOrDefault(Function(f) Not TypeOf f Is Form1)
                If Not formFront Is Nothing Then
                    formFront.Activate()
                End If
            End If
        End Sub
    Reemplaza Form1 por el nombre de tu formulario.


    Píldoras .NET
    Artículos, tutoriales y ejemplos de código .NET

    Píldoras JS
    Artículos, tutoriales y ejemplos de código JavaScript, HTML5, CSS3, ...

    martes, 28 de julio de 2015 14:17
  • Debes tener el objeto al que quieres controlar perfectamente identificado, ya sea declararlo como variable global o en alguna lista, esto debido a que no puedes mantenerlo atrás siempre sino que debes agregar código para que en el evento activated del formulario, el que quieres mandar al fondo se valla para atrás.

    Este código te envía un form siempre al fondo

                Form1 objForm = new Form1();
                objForm.Show();
                objForm.SendToBack();

    Bueno a cada formulario le vas a crear una propiedad de tipo Form en donde guardaras la referencia del formulario que vas a mandar hacia atrás.

    public Form formulario;

    cuando crees el objeto form, también pasa el form del original para poder llegar a el.

    y cada que llames el método activated, invoca el sendtoback para que el formulario siempre este atras

    saludos


    Ing. Carlos Monroy MCP, MCAD, MCSD, MCTS

    martes, 28 de julio de 2015 14:19
  • Si creo que esta es la respuesta, pero no entiendo bien como hacerlo :-(

    (es que soy muy novato)

    ¿ese código, va en la función public form?

    ¿esa función va en todos los formularios o puede ir en un modulo y llamarla desde cada formulario?

    ¿Form1, debería ser el nombre de mi form que deseo mantener detrás?

    En fin, veo que debo aprender mucho mas antes de entender esto, pero de todas maneras, gracias por las respuestas

    miércoles, 29 de julio de 2015 19:49