que - tablelayoutpanel dinamico c#
Eliminando una fila especĂfica en TableLayoutPanel (5)
El código para eliminar la fila en la posición dada se proporciona a continuación. Una cosa que mencionar: los controles que obtenemos por panel.GetControlFromPosition (...) deben estar visibles o, de lo contrario, devolverá el valor nulo en lugar de los controles invisibles.
public void remove_row(TableLayoutPanel panel, int row_index_to_remove)
{
if (row_index_to_remove >= 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, row_index_to_remove);
panel.Controls.Remove(control);
}
// move up row controls that comes after row we want to remove
for (int i = row_index_to_remove + 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);
}
}
}
// remove last row
panel.RowStyles.RemoveAt(panel.RowCount - 1);
panel.RowCount--;
}
Tengo TableLayoutPanel al que agrego filas de forma programática. El usuario básicamente elige una propiedad y luego se muestra en la tabla junto con algunos controles. Creo que aquí tengo un problema de comprensión general e intentaré explicarlo.
Uno de los controles en cada fila es un botón ''eliminar''. Ese botón debería eliminar la fila en la que se encuentra. Lo que hice fue agregar un controlador de eventos al botón y establecer el número de filas actual.
deleteTalent.Click += (sender, e) => buttonClickHandler(numberOfRows);
Código del manejador:
private void buttonClickHandler(int rowCount)
{
int count = rowCount - 1;
for (int i = count; i < (count + 5); i++)
{
balanceTable.Controls.RemoveAt(count);
}
balanceTable.RowStyles.RemoveAt(count);
balanceTable.RowCount--;
}
Lo miré durante horas y jugué un rato. Pero no puedo encontrar una solución limpia que funcione. También soy bastante nuevo en C #
Aquí está la función completa que crea una nueva fila:
private void addBalanceItems(ToolStripMenuItem item)
{
int numberOfRows = balanceTable.RowCount;
if (numberOfRows > 1)
{
balanceTable.RowStyles.Add(new System.Windows.Forms.RowStyle(System.Windows.Forms.SizeType.AutoSize));
}
balanceTable.Height = numberOfRows * 45;
Steigerungsrechner rechner = new Steigerungsrechner();
string tag = item.Tag.ToString();
//change that asap :(
if (tag == "A") { rechner.column = 1; }
if (tag == "B") { rechner.column = 2; }
if (tag == "C") { rechner.column = 3; }
if (tag == "D") { rechner.column = 4; }
if (tag == "E") { rechner.column = 5; }
if (tag == "F") { rechner.column = 6; }
if (tag == "G") { rechner.column = 7; }
if (tag == "H") { rechner.column = 8; }
Label talentName = new Label();
talentName.Text = item.Text;
talentName.Height = standardHeight;
talentName.TextAlign = ContentAlignment.MiddleLeft;
talentName.AutoSize = true;
Label cost = new Label();
cost.TextChanged += (sender, e) => costChangeHandler(cost);
cost.Height = standardHeight;
cost.TextAlign = ContentAlignment.MiddleLeft;
TextBox startValue = new TextBox();
startValue.TextChanged += (sender, e) => startValueChangeHandler(rechner, startValue, cost);
startValue.Height = standardHeight;
startValue.TextAlign = HorizontalAlignment.Center;
TextBox endValue = new TextBox();
endValue.TextChanged += (sender, e) => endValueChangeHandler(rechner, endValue, cost);
endValue.Height = standardHeight;
endValue.TextAlign = HorizontalAlignment.Center;
Button deleteTalent = new Button();
deleteTalent.Text = "x";
deleteTalent.Click += (sender, e) => buttonClickHandler(numberOfRows);
deleteTalent.Height = standardHeight;
balanceTable.Controls.Add(talentName);
balanceTable.Controls.Add(startValue);
balanceTable.Controls.Add(endValue);
balanceTable.Controls.Add(cost);
balanceTable.Controls.Add(deleteTalent);
balanceTable.Visible = true;
balanceTable.RowCount++;
}
Cualquier ayuda sería muy apreciada! :)
Eliminar los controles existentes de rowCount
al principio
for(int i = 0; i < panel.ColumnCount; i++){
Control Control = panel.GetControlFromPosition(i, rowCount);
panel.Controls.Remove(Control);
}
Luego quitar la fila
panel.RowStyles.RemoveAt(rowCount-1);
No puede eliminar completamente una fila en el tablelayoutpanel
de tablelayoutpanel
pero hay una solución:
- Elimine todos los controles de la fila, más fácil si conoce los nombres de los controles, ya que puede llamar al método de disposición.
- Establezca el alto de la fila en tal vez
2px
usando el método de estilo de fila (por ejemplo,tablelayoutpanel1.Rowstyle(index).height=2
)
Para mí, esto funcionó de maravilla, la fila estaba completamente colapsada, independientemente del índice de la fila.
Sí, eliminar una fila arbitraria de un TableLayoutPanel no es para nada intuitivo. Realmente arruinaron el diseño en este.
La única forma de eliminar filas es estableciendo la propiedad RowCount
. Esto solo es bastante extraño; Esa propiedad parece que debería ser de solo lectura y el código que hace esto me parece mal cada vez que lo veo.
Pero más allá de eso, la consecuencia de este diseño es que no puede eliminar filas del medio. Restablecer la propiedad RowCount
solo hará que las filas se recorten desde la parte inferior.
La solución es un poco difícil de manejar, con varios pasos para equivocarse:
- Elimina los controles de la fila que deseas 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.
- Finalmente, elimine la última fila disminuyendo el valor de la propiedad
RowCount
.
Una rápida búsqueda 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 se me ha dicho que solo despeje y establezco el RowHeight
de la fila que deseo "eliminar" en 0. De esta manera, el cambio de tamaño automático hace el trabajo por usted. Sin embargo, es probable que todavía quieras eliminar los controles que contiene.
Eliminando la tabla completa -
tableLayoutPanel1.Controls.Clear();
tableLayoutPanel1.RowStyles.Clear();
Ponga su encabezado de la tabla otra vez -
tableLayoutPanel.RowCount = 1;
tableLayoutPanel.RowStyles.Add(new RowStyle(SizeType.Absolute, 20F));
tableLayoutPanel.Controls.Add(new Label() { Text = "MONTH", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 0, tableLayoutPanel.RowCount - 1);
tableLayoutPanel.Controls.Add(new Label() { Text = "YEAR", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 1, tableLayoutPanel.RowCount - 1);
tableLayoutPanel.Controls.Add(new Label() { Text = "MEASURED WAFERS", Font = new Font("Century Gothic", 12, FontStyle.Bold), ForeColor = Color.LightGray }, 2, tableLayoutPanel.RowCount - 1);
3 columnas - 1 fila
Tal vez alguien pueda usar mis códigos, funciona bien ...