2010-07-27 14 views
10

Tengo un groupbox que contiene un panel flowlayout y el panel flowlayout contiene un grupo de controles. Configuré el panel de distribución de flujo para que se acople con el padre. Como no sé cuántos controles habrá en el panel, configuro el cuadro de grupo autosize en true y autosizemode para que crezca y se reduzca. Cuando hago esto, groupbox se contrae como si estuviera vacío. Necesito la leyenda, así que no puedo eliminar la carpeta de grupo. Alguien sabe por qué está pasando esto?Groupbox con un panel flowlayout dentro y autosize = true se encoge como está vacío

Respuesta

5

No hay nada que impida que FlowLayoutPanel se reduzca a nada. Al menos tendrá que establecer su propiedad AutoSize en True también.

+1

gracias. eso detuvo el encogimiento, pero causó otro problema. Crece horizontalmente, lo que provoca la necesidad de desplazarse de un lado a otro en el contenedor padre de groupboxes. el desplazamiento anterior era solo vertical. – scott

+1

Puede establecer MaximumSize.Width en el FLP para evitar eso. –

+1

gracias. eso funcionó bien. – scott

0

Usted dice "No sé cuántos controles habrá en el panel". ¿Tiene algún control en el FlowLayoutPanel en el momento del diseño? Si no lo haces, esto suena como el comportamiento esperado. El panel no tiene nada por lo que su tamaño deseado es cero, por lo que el tamaño deseado del GroupBox es cero.

Si este es el caso, entonces, con un poco de suerte, todos los controles deben agregarse en el tiempo de ejecución.

+0

sí he controles en ella en tiempo de diseño. Una vez que todo funciona con una cantidad conocida de controles. este código se autogenerará en base a un archivo xml. En ese momento no sabré cuántos controles habrá. – scott

0

Establece las propiedades Anclaje: Superior, Inferior, Izquierda, Derecha para groupBox.

5

Estaba tratando de hacer lo mismo hoy. A continuación se muestra la solución que se me ocurrió, que es acoplar el FlowLayoutPanel dentro de GroupBox y luego usar los eventos Resize y ControlAdded del FlowLayoutPanel para activar el redimensionamiento del GroupBox padre.

El controlador de cambio de tamaño encuentra la parte inferior de los últimos controles en el FlowLayoutPanel, y cambia el tamaño del GroupBox con suficiente espacio para contener los controles más bajos en el FlowLayoutPanel.

Intenté usar AutoSize = true en FlowLayoutPanel y GroupPanel. Pero desafortunadamente esto permite que FlowLayoutPanel crezca horizontalmente.

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 

     int numGroupBoxes = 4; 

     for (int groupBoxIndex=0; groupBoxIndex<numGroupBoxes; groupBoxIndex++) 
     { 
      GroupBox groupBox = new GroupBox(); 
      groupBox.Text = "Group " + groupBoxIndex; 
      groupBox.Size = new Size(this.Width, 0); 
      groupBox.Dock = DockStyle.Top; 
      this.Controls.Add(groupBox); 

      FlowLayoutPanel groupBoxFlowLayout = new FlowLayoutPanel(); 
      groupBoxFlowLayout.Dock = DockStyle.Fill; 
      groupBox.Controls.Add(groupBoxFlowLayout); 

      int extraSpace = 25; // the difference in height between the groupbox and the contents inside of it 

      MethodInvoker resizeGroupBox = (() => 
      { 
       int numControls = groupBoxFlowLayout.Controls.Count; 
       if (numControls > 0) 
       { 
        Control lastControl = groupBoxFlowLayout.Controls[numControls - 1]; 
        int bottom = lastControl.Bounds.Bottom; 
        groupBox.Size = new Size(groupBox.Width, bottom + extraSpace); 
        groupBoxFlowLayout.Size = new Size(groupBoxFlowLayout.Width, bottom); 
       } 
      }); 

      groupBoxFlowLayout.Resize += ((s, e) => resizeGroupBox()); 
      groupBoxFlowLayout.ControlAdded += ((s, e) => resizeGroupBox()); 

      // Populate each flow panel with a different number of buttons 
      int numButtonsInGroupBox = 3 * (groupBoxIndex+1); 
      for (int buttonIndex = 0; buttonIndex < numButtonsInGroupBox; buttonIndex++) 
      { 
       Button button = new Button(); 
       button.Margin = new Padding(0, 0, 0, 0); 
       string buttonText = buttonIndex.ToString(); 
       button.Text = buttonText; 
       button.Size = new Size(0,0); 
       button.AutoSize = true; 
       groupBoxFlowLayout.Controls.Add(button); 
      } 

     } 


    } 

} 

Éstos son tres capturas de pantalla del control de redimensionado a diferentes anchuras diferentes:

Three screenshats of the control resized to various different widths

+0

esto funciona bien, pero es una buena idea cambiar el tamaño del control de usuario al cambiar el tamaño del grupo. – Jerry

Cuestiones relacionadas