Te damos el resultado a este inconveniente, o por lo menos eso esperamos. Si tienes interrogantes dínoslo, que para nosotros será un gusto responderte
Solución:
Sí, eliminar una fila arbitraria de un TableLayoutPanel es de nada intuitivo. Realmente arruinaron el diseño de este.
La única forma de eliminar filas es configurando el RowCount
propiedad. Esto por sí solo es bastante extraño; esa propiedad parece que debería ser de solo lectura y el código que hace esto me parece incorrecto cada vez que lo veo.
Pero más allá de eso, la consecuencia de este diseño es que no se pueden quitar filas del medio. Restablecer el RowCount
La propiedad solo hará que las filas se eliminen de la parte inferior.
La solución es un poco difícil de manejar, con múltiples pasos para equivocarse:
- Quite los controles de la fila que desea eliminar
- Si corresponde, mueva esos controles a otra fila.
- Mueva todos los controles en las otras filas que vienen después de la fila que desea eliminar una fila hacia arriba.
- Finalmente, elimine la última fila disminuyendo el valor de la
RowCount
propiedad.
Una búsqueda rápida en Google revela que alguien ha escrito y compartido un código que pretende hacer esto. Está en VB.NET, pero debería traducirse fácilmente a su dialecto nativo.
Admito que he sido conocido por simplemente despejar y establecer el RowHeight
de la fila que deseo “eliminar” a 0. De esta manera, el tamaño automático hace el trabajo por usted. Sin embargo, es probable que aún desee eliminar los controles que contiene.
Aquí hay un static clase que puede ayudarlo a eliminar cualquier fila por su índice:
using System.Windows.Forms;
public static class TableLayoutHelper
public static void RemoveArbitraryRow(TableLayoutPanel panel, int rowIndex)
if (rowIndex >= panel.RowCount)
return;
// delete all controls of row that we want to delete
for (int i = 0; i < panel.ColumnCount; i++)
var control = panel.GetControlFromPosition(i, rowIndex);
panel.Controls.Remove(control);
// move up row controls that comes after row we want to remove
for (int i = rowIndex + 1; i < panel.RowCount; i++)
for (int j = 0; j < panel.ColumnCount; j++)
var control = panel.GetControlFromPosition(j, i);
if (control != null)
panel.SetRow(control, i - 1);
var removeStyle = panel.RowCount - 1;
if (panel.RowStyles.Count > removeStyle)
panel.RowStyles.RemoveAt(removeStyle);
panel.RowCount--;
Una cosa para mencionar: los controles que obtenemos a través de panel.GetControlFromPosition(...)
debe ser visible o volverá null
en lugar de controles invisibles.
Eliminar los controles existentes de rowCount
en primer lugar
for(int i = 0; i < panel.ColumnCount; i++)
Control Control = panel.GetControlFromPosition(i, rowCount);
panel.Controls.Remove(Control);
Luego elimina la fila
panel.RowStyles.RemoveAt(rowCount-1);
Si estás contento con lo expuesto, eres capaz de dejar una noticia acerca de qué le añadirías a este enunciado.