Saltar al contenido

Eliminar una fila específica en TableLayoutPanel

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:

  1. Quite los controles de la fila que desea eliminar
  2. Si corresponde, mueva esos controles a otra fila.
  3. Mueva todos los controles en las otras filas que vienen después de la fila que desea eliminar una fila hacia arriba.
  4. 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *