none
[Problema] Ayuda con esta condición RRS feed

  • Pregunta

  • Hola,

    Estoy creando una condición para detectar si esta visible un panel pero solo me funciona el primero, me estoy equivocando en algo?

       If Panel_1.Visible Or Panel_2.Visible = True Then
                    Else
                        PanelUsuario.Visible = True
                       
                    End If

    martes, 19 de junio de 2018 11:41

Respuestas

  • "Symantecc" escribió:

    > Estoy creando una condición para detectar si esta visible un panel pero
    > solo me funciona el primero, me estoy equivocando en algo?
    >
    >   If Panel_1.Visible Or Panel_2.Visible = True Then
    >   Else
    >       PanelUsuario.Visible = True
    >   End If

    La condición que has establecido mediante el operador Or será True siempre que la propiedad Visible de alguno de los dos controles Panel sea True. Es decir, si Panel_1 es True y Panel_2 es False, el resultado será True. Y viceversa, si Panel_1 es False y Panel_2 es True, el resultado también será True. Por supuesto, si el valor de las dos propiedades Visible es True, el resultado también será True. Para que el resultado sea False, el valor de las dos propiedades Visible tiene que ser también False.

    Or (Operador, Visual Basic)

    > ... solo me funciona el primero, ...

    La verdad es que no me entero lo que quieres decir cuando escribes que "solo me funciona el primero". ¿Te refieres a que el valor de la propiedad Visible de Panel_1 es True? Si el valor es True, SIEMPRE se ejecutará el código existente en la instrucción If, aunque en tu caso, poco código se va a ejecutar, ya que NO APARECE ningún código escrito en dicho bloque.

    Ahora bien, si tu intención es que se ejecute el bloque If siempre que el valor de la propiedad Visible de los dos controles Panel sea True, entonces deberás de utilizar el operador And.

    And (Operador, Visual Basic)

        If (Panel_1.Visible And Panel_2.Visible) Then
    ' El resultado de la comparación And es True. ' Se ejecutará este bloque SIEMPRE que el ' valor de las dos propiedades sea True. Else
    ' El resultado de la comparación And es False. '
    PanelUsuario.Visible = True End If

    Aquí tienes la comparación de resultados tanto con el operador Or como con el operador And:

        Panel_1     Panel_2      Or        And
        =======================
        True          True          True      True
        True          False         True      False
        False         True          True      False
        False         False         False     False


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    miércoles, 20 de junio de 2018 15:10
    Moderador
  • "Symantecc" escribió:

    > Hola Enrique, gracias, se me ha solucionado el problema.

    ¿Se ha solucionado el problema utilizando el operador And?

    > Queria decir que al mencionar esos dos paneles, solo me funcionaba el primero y el segundo no.

    Me vas a perdonar, pero sigo sin entender nada sobre qué debo entender por "funcionar". ¿?

    > Si quisiera añadir varios mas, tendria que seguir usando and?
    >
    > Es decir, panel1.visible and panel2.visible and panel3,visible and panel4.visible y asi..?

    Pues depende. Si tu intención es que se ejecute el bloque If cuando la propiedad Visible de todos los 24 controles Panel que pueda haber en tu formulario sea True, entonces tendrás que utilizar el operador And de esa manera:

        If (Panel1.Visible And Panel2.Visible And Panel3.Visible And ... And Panel24.Visible) Then
            ' El resultado de la comparación es True.
    
        Else
            ' El resultado de la comparación es False.
    
        End If


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 20 de junio de 2018 16:03
    Moderador
  • "Symantecc" escribió:

    > Lo que pretendo hacer, es que si dichos paneles que menciono están en visible=true,
    > no llamo a la accion pero si esta en false, lo llamo a la accion

    ¡Lo fácil que es decir claramente las cosas desde un primer momento! :-(

    Pues si es así, entonces tienes que utilizar el operador And tal y como te he indicado anteriormente.

    Ahora comprendo porque no existe código en el bloque If y sí en el bloque Else.

    Si solamente deseas ejecutar la acción cuando alguna propiedad Visible de los diferentes controles Panel sea False, mejor será que implementes la instrucción If ... End If como indico a continuación:

        If Not (Panel_1.Visible And Panel_2.Visible And Panel_3.Visible) Then
            ' Ejecutar la acción cuando el resultado de la comparación sea False,
            ' es decir, alguna propiedad Visible sea False.
            PanelUsuario.Visible = True
        End If

    De esta manera no tienes que tener sin código el bloque If. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    miércoles, 20 de junio de 2018 16:38
    Moderador
  • "Symantecc" preguntó:

    > en vez de detectar si está en visible, como podria detectar si esta
    > en primer posicion el panel? ees decir por encima de todo

    Si te refieres al Orden Z en el que se sitúan los controles en el formulario, te comento que solamente puede haber uno situado en la parte superior, que puede ser un Panel, Label, TextBox, DataGridView, o cualquier otro control, de la misma manera que también puede haber solamente uno en la parte inferior de dicho orden.

    Con el siguiente código podrás obtener la referencia del control que está situado en la parte superior del orden Z del formulario actual, es decir, aquel que tenga el índice 0 en la colección Controls del formulario:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim ctrl As Control = Me.Controls(Controls.OfType(Of Control).Min(Function(c) Controls.GetChildIndex(c, False)))
    
            MessageBox.Show($"El control en el nivel superior del orden Z es: {ctrl.Name}")
    
        End Sub

    Una vez obtenida la referencia del control, me imagino que tú sabrás lo que deseas hacer con él, porque como bien creo que comprenderás, yo no sé lo que hacer con dicho control. ;-)

    Insisto que en este caso puedes obtener la referencia de un control distinto a un control Panel.

    ¿Que deseas saber qué control Panel está situado en un nivel más superior en el orden Z? Entonces tendrás que consultar solamente el índice de los controles del tipo de dato Panel:

        Dim ctrl As Control = Me.Controls(Controls.OfType(Of Panel).Min(Function(c) Controls.GetChildIndex(c, False)))

    Pero en este caso, puede que haya un control Label, por poner un ejemplo, que esté tapando al control Panel referenciado. ¿Me explico?

    Como en tu pregunta no has comentado nada sobre dónde están colocados los controles Panel, yo he supuesto que están insertados en un formulario (un objeto de la clase Form), porque me imagino que sabrás que un control Panel puede también actuar de contenedor de otros controles, entre ellos, de otros controles Panel. Si es éste el caso, en lugar de recorrer la colección de controles del formulario, tendrás que recorrer la colección de controles de aquel control que actúe de contenedor, que será la colección Controls que deberá llamar al método GetChildIndex.

    Para más información sobre el método GetChildIndex, te remito a la ayuda de MSDN:

    Método Control.ControlCollection.GetChildIndex (Control, Boolean)

    NOTA:

    Te comento que no es necesario que desmarques las respuestas para hacer una nueva pregunta que no tiene nada que ver con las anteriores, porque si la respuesta es correcta, lo suyo es que se queda marcada como correcta para siempre, o ¿es que ahora resulta que la respuesta no es correcta?

    Espero que dentro de tres meses no se te vaya a ocurrir volver a esta conversación para realizar una nueva pregunta, porque entonces, ¿qué harías? ¿Desmarcar todas las respuestas correctas que estuvieran marcadas? ;-)

    Si la pregunta nueva no tiene nada que ver con aquella con la que iniciaste la conversación, lo correcto es INICIAR una nueva conversación (hilo). ¿De acuerdo?


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    viernes, 22 de junio de 2018 14:28
    Moderador
  • "Symantecc" escribió:

    > Entiendo sobre la posición y el orden de los objetos. Pero no me aclaro en hacer la
    > condición para poner un orden sobre la pantalla para que no se monte otro panel encima

    Ni yo tampoco me aclaro sobre qué es lo que realmente quieres hacer. ¿?

    Te indico que el orden-Z de los controles se establece automáticamente conforme añades controles al formulario, o en su caso, a aquel control que actúe de contenedor de otros controles.

    En tiempo de diseño puedes modificar el orden de un control seleccionando en el menú contextual del control Traer al frente o Enviar al fondo, o si lo prefieres, también lo puedes modificar en tiempo de ejecución ejecutando los métodos BringToFront (para traer el control al principio del orden-Z) o SendToBack (para enviarlo al final del orden-Z).

    Se inició esta conversación con una condición para verificar el valor de la propiedad Visible de ciertos controles Panel, y ya vamos por el orden-Z que tienen dichos controles. ¡Veremos por donde acaba esto! :-(


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    viernes, 22 de junio de 2018 15:10
    Moderador

Todas las respuestas

  • Pues el codigo arriba no luce muy correcto asumo que lo que querías hacer era esto: 
    If Panel_1.Visible = True Or Panel_2.Visible = True Then
    Tambien me parece extraño que debajo del the no tengas nada.
    miércoles, 20 de junio de 2018 11:55
  • "Symantecc" escribió:

    > Estoy creando una condición para detectar si esta visible un panel pero
    > solo me funciona el primero, me estoy equivocando en algo?
    >
    >   If Panel_1.Visible Or Panel_2.Visible = True Then
    >   Else
    >       PanelUsuario.Visible = True
    >   End If

    La condición que has establecido mediante el operador Or será True siempre que la propiedad Visible de alguno de los dos controles Panel sea True. Es decir, si Panel_1 es True y Panel_2 es False, el resultado será True. Y viceversa, si Panel_1 es False y Panel_2 es True, el resultado también será True. Por supuesto, si el valor de las dos propiedades Visible es True, el resultado también será True. Para que el resultado sea False, el valor de las dos propiedades Visible tiene que ser también False.

    Or (Operador, Visual Basic)

    > ... solo me funciona el primero, ...

    La verdad es que no me entero lo que quieres decir cuando escribes que "solo me funciona el primero". ¿Te refieres a que el valor de la propiedad Visible de Panel_1 es True? Si el valor es True, SIEMPRE se ejecutará el código existente en la instrucción If, aunque en tu caso, poco código se va a ejecutar, ya que NO APARECE ningún código escrito en dicho bloque.

    Ahora bien, si tu intención es que se ejecute el bloque If siempre que el valor de la propiedad Visible de los dos controles Panel sea True, entonces deberás de utilizar el operador And.

    And (Operador, Visual Basic)

        If (Panel_1.Visible And Panel_2.Visible) Then
    ' El resultado de la comparación And es True. ' Se ejecutará este bloque SIEMPRE que el ' valor de las dos propiedades sea True. Else
    ' El resultado de la comparación And es False. '
    PanelUsuario.Visible = True End If

    Aquí tienes la comparación de resultados tanto con el operador Or como con el operador And:

        Panel_1     Panel_2      Or        And
        =======================
        True          True          True      True
        True          False         True      False
        False         True          True      False
        False         False         False     False


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    miércoles, 20 de junio de 2018 15:10
    Moderador
  • "Anibal Marcano Liste" escribió:

    > Pues el codigo arriba no luce muy correcto asumo que lo que querías hacer era esto:
    > If Panel_1.Visible = True Or Panel_2.Visible = True Then

    Hola, Aníbal:

    Por si lo ignoras, te comento que en Visual Basic para verificar si un valor Boolean es True, da igual ejecutar alguno de los siguientes bloques If:

       
        If (Panel_1.Visible) Then
    
        If (Panel_1.Visible = True) Then
    

    Yo, prefiero utilizar la primera.

    Y ya puestos, para verificar si el valor Boolean es False, da igual ejecutar estos otros bloques:

        If (Not Panel_1.Visible) Then
    
        If (Panel_1.Visible = False) Then
    

    Nuevamente, yo prefiero utilizar la primera. :-)

    Un saludo


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 20 de junio de 2018 15:26
    Moderador
  • Hola Enrique, gracias, se me ha solucionado el problema. Queria decir que al mencionar esos dos paneles, solo me funcionaba el primero y el segundo no. Si quisiera añadir varios mas, tendria que seguir usando and?

    Es decir, panel1.visible and panel2.visible and panel3,visible and panel4.visible y asi..?

    miércoles, 20 de junio de 2018 15:56
  • Lo que pretendo hacer, es que si dichos paneles que menciono están en visible=true, no llamo a la accion pero si esta en false, lo llamo a la accion
    miércoles, 20 de junio de 2018 15:58
  • "Symantecc" escribió:

    > Hola Enrique, gracias, se me ha solucionado el problema.

    ¿Se ha solucionado el problema utilizando el operador And?

    > Queria decir que al mencionar esos dos paneles, solo me funcionaba el primero y el segundo no.

    Me vas a perdonar, pero sigo sin entender nada sobre qué debo entender por "funcionar". ¿?

    > Si quisiera añadir varios mas, tendria que seguir usando and?
    >
    > Es decir, panel1.visible and panel2.visible and panel3,visible and panel4.visible y asi..?

    Pues depende. Si tu intención es que se ejecute el bloque If cuando la propiedad Visible de todos los 24 controles Panel que pueda haber en tu formulario sea True, entonces tendrás que utilizar el operador And de esa manera:

        If (Panel1.Visible And Panel2.Visible And Panel3.Visible And ... And Panel24.Visible) Then
            ' El resultado de la comparación es True.
    
        Else
            ' El resultado de la comparación es False.
    
        End If


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    miércoles, 20 de junio de 2018 16:03
    Moderador
  • "Symantecc" escribió:

    > Lo que pretendo hacer, es que si dichos paneles que menciono están en visible=true,
    > no llamo a la accion pero si esta en false, lo llamo a la accion

    ¡Lo fácil que es decir claramente las cosas desde un primer momento! :-(

    Pues si es así, entonces tienes que utilizar el operador And tal y como te he indicado anteriormente.

    Ahora comprendo porque no existe código en el bloque If y sí en el bloque Else.

    Si solamente deseas ejecutar la acción cuando alguna propiedad Visible de los diferentes controles Panel sea False, mejor será que implementes la instrucción If ... End If como indico a continuación:

        If Not (Panel_1.Visible And Panel_2.Visible And Panel_3.Visible) Then
            ' Ejecutar la acción cuando el resultado de la comparación sea False,
            ' es decir, alguna propiedad Visible sea False.
            PanelUsuario.Visible = True
        End If

    De esta manera no tienes que tener sin código el bloque If. ;-)


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.



    miércoles, 20 de junio de 2018 16:38
    Moderador
  • Hola Enrique, al fin se hizo la luz, quizas ahora me funcionen las aplicaciones, podría ser felíz, pero todavía ignoro como se creó el universo.  Divago, creo que no es tema para este foro.

    Bromas aparte, si le pregunté sobre el primer true es para verificar si quizas lo que quería verificar era un false en la primera (si, lo he visto bastante).

    Estoy seguro que no lo ignoras, pero es bueno precisar que no comparar con true no es una característica de VB, lo es de .Net y es igual en los otros lenguajes, no es porque no haya que comparar, es porque de por si la propiedad es booleana.  Efectivamente no es necesario agregar la comparación pero es algo sin importancia porque al final el compilador lo resuelve y normalmente los que están comenzando con programación colocan la comparación con true y luego lo van abandonando, cuestión de gustos.  

    En cuanto a usar los "And" es una de las soluciones posibles, pero  no la mejor en mantenibilidad (hay que actualizarla por cada nuevo panel) y  riesgo (si se olvida un panel)  y en este caso son 24!.  Una alternativa es reversar la lógica y ver si por lo menos uno está en no visible y así no se requiere verificarlos todos, esto puede hacerse por ejemplo así:

    Controls.OfType(Of Panel).Any(function(p) Not p.Visible)

    En todo caso siempre es agradable tomar el enfoque de desafío con los pequeños problemas y buscar distintas soluciones.

    Saludos

    jueves, 21 de junio de 2018 9:47
  • "Anibal Marcano Liste" escribió:

    > En cuanto a usar los "And" es una de las soluciones posibles, pero  no la mejor
    > en mantenibilidad (hay que actualizarla por cada nuevo panel) y  riesgo (si se
    > olvida un panel)  y en este caso son 24!.  Una alternativa es reversar la lógica
    > y ver si por lo menos uno está en no visible y así no se requiere verificarlos
    > todos, esto puede hacerse por ejemplo así:
    >
    > Controls.OfType(Of Panel).Any(function(p) Not p.Visible)

    Lo de 24 controles Panel ha sido cosa mía a la respuesta de si habría que comparar más de 2 controles Panel.

    Alternativas, desde luego que las hay, como la que bien has comentado, porque si la cuestión es que el valor de la propiedad Visible de TODOS los controles Panel sea True, con recorrer la colección Controls del contenedor (supuestamente un objeto Form) limitándose únicamente a los controles Panel que hubiere, con verificar si uno es False sería más que suficiente:

        ''' <summary>
        ''' Indica si todos los controles Panel existentes en el formulario
        ''' están visibles (True) o no (False).
        ''' </summary>
        ''' <returns></returns>
        Private Function IsPanelsVisible() As Boolean
    
            For Each ctrl As Panel In Me.Controls.OfType(Of Panel)
                If (Not ctrl.Visible) Then
                    Return False
                End If
            Next
    
            Return True
    
        End Function


    Y lo comprobaríamos ejecutando simplemente:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            If (Not IsPanelsVisible()) Then
                ' Acción a ejecutar cuando todos los paneles no estén visibles.
                
            End If
    
        End Sub

    Por supuesto, soy consciente que no es sumamente necesario implementar la función IsPanelsVisible, porque la verificación también se puede hacer como has comentado:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            If (Controls.OfType(Of Panel).Any(Function(p) Not p.Visible)) Then
                ' Acción a ejecutar cuando todos los paneles no estén visibles.
    
            End If
    
        End Sub

    Pero personalmente prefiero evitar siempre que sea posible consultas LINQ y expresiones lambda, mayormente por la cantidad de código que introduce el compilador, y al cual no podemos acceder y controlar salvo en la propia consulta LINQ. En cambio, con una simple función que hace exactamente lo mismo, tenemos el control de lo que realmente deseamos hacer.

    ¿Que la expresión lambda queda más "guay"? No lo voy a poner en duda, pero yo soy más "clásico". ;-)

    Por supuesto, es mi opinión personal lo cual no significa que esté en lo correcto.

    > En todo caso siempre es agradable tomar el enfoque de desafío con los pequeños
    > problemas y buscar distintas soluciones.

    Totalmente de acuerdo.


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    jueves, 21 de junio de 2018 10:27
    Moderador
  • y otra pregunta enrique, en vez de detectar si está en visible, como podria detectar si esta en primer posicion el panel? ees decir por encima de todo
    viernes, 22 de junio de 2018 10:25
  • "Symantecc" preguntó:

    > en vez de detectar si está en visible, como podria detectar si esta
    > en primer posicion el panel? ees decir por encima de todo

    Si te refieres al Orden Z en el que se sitúan los controles en el formulario, te comento que solamente puede haber uno situado en la parte superior, que puede ser un Panel, Label, TextBox, DataGridView, o cualquier otro control, de la misma manera que también puede haber solamente uno en la parte inferior de dicho orden.

    Con el siguiente código podrás obtener la referencia del control que está situado en la parte superior del orden Z del formulario actual, es decir, aquel que tenga el índice 0 en la colección Controls del formulario:

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    
            Dim ctrl As Control = Me.Controls(Controls.OfType(Of Control).Min(Function(c) Controls.GetChildIndex(c, False)))
    
            MessageBox.Show($"El control en el nivel superior del orden Z es: {ctrl.Name}")
    
        End Sub

    Una vez obtenida la referencia del control, me imagino que tú sabrás lo que deseas hacer con él, porque como bien creo que comprenderás, yo no sé lo que hacer con dicho control. ;-)

    Insisto que en este caso puedes obtener la referencia de un control distinto a un control Panel.

    ¿Que deseas saber qué control Panel está situado en un nivel más superior en el orden Z? Entonces tendrás que consultar solamente el índice de los controles del tipo de dato Panel:

        Dim ctrl As Control = Me.Controls(Controls.OfType(Of Panel).Min(Function(c) Controls.GetChildIndex(c, False)))

    Pero en este caso, puede que haya un control Label, por poner un ejemplo, que esté tapando al control Panel referenciado. ¿Me explico?

    Como en tu pregunta no has comentado nada sobre dónde están colocados los controles Panel, yo he supuesto que están insertados en un formulario (un objeto de la clase Form), porque me imagino que sabrás que un control Panel puede también actuar de contenedor de otros controles, entre ellos, de otros controles Panel. Si es éste el caso, en lugar de recorrer la colección de controles del formulario, tendrás que recorrer la colección de controles de aquel control que actúe de contenedor, que será la colección Controls que deberá llamar al método GetChildIndex.

    Para más información sobre el método GetChildIndex, te remito a la ayuda de MSDN:

    Método Control.ControlCollection.GetChildIndex (Control, Boolean)

    NOTA:

    Te comento que no es necesario que desmarques las respuestas para hacer una nueva pregunta que no tiene nada que ver con las anteriores, porque si la respuesta es correcta, lo suyo es que se queda marcada como correcta para siempre, o ¿es que ahora resulta que la respuesta no es correcta?

    Espero que dentro de tres meses no se te vaya a ocurrir volver a esta conversación para realizar una nueva pregunta, porque entonces, ¿qué harías? ¿Desmarcar todas las respuestas correctas que estuvieran marcadas? ;-)

    Si la pregunta nueva no tiene nada que ver con aquella con la que iniciaste la conversación, lo correcto es INICIAR una nueva conversación (hilo). ¿De acuerdo?


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.


    viernes, 22 de junio de 2018 14:28
    Moderador
  • Hola Enrique Gracias por responder,

    Entiendo sobre la posición y el orden de los objetos. Pero no me aclaro en hacer la condición para poner un orden sobre la pantalla para que no se monte otro panel encima

    viernes, 22 de junio de 2018 14:53
  • "Symantecc" escribió:

    > Entiendo sobre la posición y el orden de los objetos. Pero no me aclaro en hacer la
    > condición para poner un orden sobre la pantalla para que no se monte otro panel encima

    Ni yo tampoco me aclaro sobre qué es lo que realmente quieres hacer. ¿?

    Te indico que el orden-Z de los controles se establece automáticamente conforme añades controles al formulario, o en su caso, a aquel control que actúe de contenedor de otros controles.

    En tiempo de diseño puedes modificar el orden de un control seleccionando en el menú contextual del control Traer al frente o Enviar al fondo, o si lo prefieres, también lo puedes modificar en tiempo de ejecución ejecutando los métodos BringToFront (para traer el control al principio del orden-Z) o SendToBack (para enviarlo al final del orden-Z).

    Se inició esta conversación con una condición para verificar el valor de la propiedad Visible de ciertos controles Panel, y ya vamos por el orden-Z que tienen dichos controles. ¡Veremos por donde acaba esto! :-(


    Enrique Martínez Montejo
    [MS MVP - Visual Studio y Tecnologías de Desarrollo]

    Nota informativa: La información contenida en este mensaje, así como el código fuente incluido en el mismo, se proporciona «COMO ESTÁ», sin garantías de ninguna clase, y no otorga derecho alguno. Usted asume cualquier riesgo al poner en práctica, utilizar o ejecutar lo recomendado o sugerido en el presente mensaje.

    Si esta respuesta le ha resultado útil, recuerde marcarla como satisfactoria.

    Si usas Visual Basic .NET y deseas ser productivo y feliz, se inteligente y activa la instrucción
    Option Strict.

    viernes, 22 de junio de 2018 15:10
    Moderador