Dividir un panel en dos para añadir controles

Creado por David Miralpeix, Modificado el Wed, 20 Mar 2024 a las 10:44 AM por Pablo Céspedes

En este ejemplo veremos como, partiendo de un determinado panel, dividir el espacio en dos para asignar el control original en el nuevo que crearemos.


Esto es especialmente útil si, por ejemplo, necesitamos añadir un filtro a un grid ya existente o añadir algún tipo de sumatorio o control.


Código VB6:

Para el siguiente ejemplo se parte que existe un panel llamado "PanelOriginal" y un grid dentro con el nombre de "GridOriginal". Creará un panel nuevo con dos botones (Bot1 y Bot2) y colocará "GridOriginal" en la parte de abajo.


Si deseamos dividir el split en vertical en lugar de horizontal deberemos usar el código "2" en la adición del mismo (en el Panes.Add), pudiendo tomar cada uno de los siguientes valores:

lSplit.Panes.Add lSplit.Panes(0).Name, 0     ' Top - Creará el nuevo panel en la parte de arriba
lSplit.Panes.Add lSplit.Panes(0).Name, 1     ' Bottom - Creará el nuevo panel en la parte de abajo
lSplit.Panes.Add lSplit.Panes(0).Name, 2     ' Left - Creará el nuevo panel en la parte de la izquierda
lSplit.Panes.Add lSplit.Panes(0).Name, 3     ' Right - Creará el nuevo panel en la parte de la derecha
Sub Show()

  gForm.Controls("GridOriginal").ActivarScripts = True

  ' Recuperamos el panel original que contiene el grid
  Set lPnl = gForm.Controls("PanelOriginal")

  ' Creamos un splitter en el panel original  
  Set lSplit = gForm.Controls.Add("SSSplitter.SSSplitter.4","Pers_Splitter", lPnl)
  With lSplit
        .AutoSize = 1 ''''''''Fill container
        .Borderstyle = 1 ''''''''None
        .SplitterResizeStyle = 1 '''''''' proportional
        .SplitterBarAppearance = 1 '''''''' Borderless
        .visible = True 
  End With  

  ' Creamos dos paneles nuevos

  Set Panel1 = gForm.Controls.Add("AhoraOCX.CntPanel", "Pers_Panel1")    
  Panel1.Visible = True

  Set Panel2 = gForm.Controls.Add("AhoraOCX.CntPanel", "Pers_Panel2")    
  Panel2.Visible = True

  ' Creamos dos botones en uno de los paneles nuevos

  Set lBot1 = gForm.Controls.Add("AhoraOCX.cntBotonera", "Pers_Bot1",Panel1) 
  With lBot1
    .ActivarScripts = True
    .SeguridadObjeto = 0
    .BotonesMantenimiento = 0
    .Visible = True
    .BotonAdd "","Pers_Bot1_A","",0,False,465
    .HabilitaBotones
  End With  

  Set lBot2 = gForm.Controls.Add("AhoraOCX.cntBotonera", "Pers_Bot2",Panel1) 
  With lBot2
    .ActivarScripts = True
    .SeguridadObjeto = 0
    .BotonesMantenimiento = 0
    .Visible = True
    .BotonAdd "","Pers_Bot2_A","",0,False,466
    .Top = lBot1.Top + lBot1.height
    .HabilitaBotones
  End With

  ' Asignamos el grid original en el segundo panel que hemos creado
  Set gForm.Controls("GridOriginal").Container = Panel2

  ' Añadimos un panel nuevo
  lSplit.Panes.Add lSplit.Panes(0).Name, 0

  ' Por último asignamos los paneles a las diferentes ventanas del splitter
  lSplit.Panes(0).Control = Panel1
  lSplit.Panes(1).Control = Panel2

End Sub

Código C#:

Para el siguiente ejemplo se parte que existe un panel llamado "panMain" y un grid dentro con el nombre de "GridOriginal". Creará un panel nuevo con dos botones (Bot1 y Bot2) y colocará "GridOriginal" en la parte de abajo.

using AhoraSistema;
using AhoraOCX;
using AhoraCore;
using static AhoraCore.VBA.Interaction;
using System.Windows.Forms;

namespace AhoraScriptsPantalla
{
  public class AhoraScripts_Pers_Generico : AhoraOCX.AhoraBaseScript
  {

    // Dentro de un frmGenerico añado el siguiente código:
    public void Show()
    {
      ICntPanel panelPadre = (ICntPanel)gForm.Controls["panMain"];
      panelPadre.ResizeEnabled = true;
            panelPadre.ResizeInterior = true;
            ICntGridUsuario lGrid = (ICntGridUsuario)gForm.Controls.Add("AhoraOCX.CntGridUsuario", "GridOriginal", panelPadre );
      lGrid.Caption = "GridOriginal";

      ICntPanel lPnl = (ICntPanel)gForm.Controls["panMain"];

      ICntSplitter lSplit = (ICntSplitter)gForm.Controls.Add("SSSplitter.SSSplitter.4", "Pers_Splitter", lPnl);
      lSplit.Visible = true;

      ICntPanel Panel1 = (ICntPanel)gForm.Controls.Add("AhoraOCX.CntPanel", "Pers_Panel1");
      Panel1.Visible = true;
            ICntPanel Panel2 = (ICntPanel)gForm.Controls.Add("AhoraOCX.CntPanel", "Pers_Panel2");
            Panel2.Visible = true;

      ICntBotonera lBot1 = (ICntBotonera)gForm.Controls.Add("AhoraOCX.CntBotonera", "Pers_Bot1", Panel1);
      lBot1.ActivarScripts = true;
      lBot1.SeguridadObjeto = 0;
      lBot1.BotonesMantenimiento = EBotonesMant.eBotMant_Ninguno;
      lBot1.Visible = true;
      lBot1.BotonAdd("", "Pers_Bot1_A", "", ETipo_Menu.eTipo_Menu_Boton, false, 465);
      lBot1.HabilitaBotones();

           
      ICntBotonera lBot2 = (ICntBotonera)gForm.Controls.Add("AhoraOCX.CntBotonera", "Pers_Bot2", Panel1);
      lBot2.ActivarScripts = true;
      lBot2.SeguridadObjeto = 0;
      lBot2.BotonesMantenimiento = EBotonesMant.eBotMant_Ninguno;
      lBot2.Visible = true;
      lBot2.BotonAdd("", "Pers_Bot2_A", "", ETipo_Menu.eTipo_Menu_Boton, false, 466);
      lBot2.Top = lBot2.Top + lBot2.Height;
      lBot2.HabilitaBotones();

      gForm.Controls["GridOriginal"].Parent = (Control)Panel2;

      // Rellenamos los paneles del control lSplit directamente sobre el control CntSplitter
      (lSplit as CntSplitter).Panel1.Control = Panel1;
      (lSplit as CntSplitter).Panel2.Control = Panel2;

      (lSplit as Control).Dock = DockStyle.Fill;
      // SplitterPosition determina la posición inicial del separador en función de la orientación del control. 
      // No usar dentro del evento Initialize y se establece el tamaño incorrectamente
      lSplit.SplitterPosition = 50;

    }

  }
}

¿Le ha sido útil este artículo?

¡Qué bien!

Gracias por sus comentarios

¡Sentimos mucho no haber sido de ayuda!

Gracias por sus comentarios

¡Háganos saber cómo podemos mejorar este artículo!

Seleccione al menos una de las razones
Se requiere la verificación del CAPTCHA.

Sus comentarios se han enviado

Agradecemos su esfuerzo e intentaremos corregir el artículo