Dock es una propiedad de los controles que nos permite asociarlos a su contenedor de manera que su tamaño y posición se ajusten de acuerdo al control que los contiene; en C# se define a través de un enumerador con los elementos Top, Left, Right, Bottom y Fill.
Aplicar estas propiedades a los controles cuando se han añadido desde modo diseño es cosa de niños; sin embargo, cuando los controles se están creando dinámicamente en tiempo de ejecución la cosa se complica.. O al menos se complicó para mí, que tuve que implementarlo en una de las aplicaciones que desarrollamos y me encontré con que el docking no posicionaba los controles como se suponía que se hiciera.
Tras buscar un rato, me encontré con que, como los controles se van posicionando conforme se agregan a su contenedor, no se realizan las relaciones correctas y por ende el posicionamiento es incorrecto. Una solución sencilla (pero que funciona muy bien) resultó ser el aplicar el método SendToBack() o BringToFront() según sea el primer o segundo control en el eje Z.
Un ejercicio muy sencillo para reproducir ésto se muestra a continuación:
En esta primer imagen, el segundo control GroupBox queda detrás del primero, pues tiene el
Dock = DockStyle.Fill, por lo que se ajusta a todo el tamaño de la forma contenedora.
En esta segunda imagen, al aplicar el método
SendToBack() al primer GroupBox, se obtiene el posicionamiento deseado :)
private void button1_Click(object sender, EventArgs e)
{
GroupBox gb1 = new GroupBox();
GroupBox gb2 = new GroupBox();
this.Controls.Add(gb1);
this.Controls.Add(gb2);
gb1.Dock = DockStyle.Top;
gb1.Text = "Uno";
gb2.Dock = DockStyle.Fill;
gb2.Text = "Dos";
//gb1.SendToBack();
gb2.BringToFront();
}
Algo medio raro, pero llega a necesitarse.. ;-)