删除TableLayoutPanel中的特定行

我有TableLayoutPanel,我以编程方式添加Rows。 用户基本上选择了一个属性,然后将其与一些控件一起显示在表中。 我想我在这里有一个普遍的理解问题,我会尝试解释它。

每行中的一个控件是“删除”按钮。 该按钮应该删除它所在的行。我所做的是向按钮添加一个事件处理程序并设置当前的rowcount。

deleteTalent.Click += (sender, e) => buttonClickHandler(numberOfRows); 

处理程序代码:

 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--; } 

我看了好几个小时,玩了一遍。 但我找不到一个干净利落的解决方案。 我也是C#的新手

这是创建新行的完整函数:

 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++; } 

任何帮助将不胜感激! 🙂

是的,从TableLayoutPanel中删除任意行根本直观。 他们真的搞砸了这个设计。

删除行的唯一方法是设置RowCount属性。 仅这一点就足够奇怪了; 这个属性确实看起来应该是只读的,每次看到它时代码都会出错。

但除此之外,这种设计的结果是你不能从中间删除行。 重置RowCount属性只会导致行从底部删除。

解决方法有点笨拙,有多个步骤出错:

  1. 从要删除的行中删除控件
  2. 如果适用,将这些控件移动到另一行。
  3. 移动要删除的行之后的其他行中的所有控件。
  4. 最后,通过递减RowCount属性的值来删除最后一行。

一个快速的谷歌搜索显示,有人编写和共享代码声称这样做。 它在VB.NET中,但应该很容易翻译成你的母语。

我承认我已经知道只是RowHeight了并将我希望“删除”的行的RowHeight设置为0.这样,自动调整function可以帮到你。 但是,您可能仍希望删除它包含的控件。

下面给出了在给定位置移除行的代码。 有一点需要提及:我们通过panel.GetControlFromPosition(…)得到的控件必须是可见的,否则它将返回null而不是不可见的控件。

  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--; } 

首先删除rowCount现有控件

 for(int i = 0; i < panel.ColumnCount; i++){ Control Control = panel.GetControlFromPosition(i, rowCount); panel.Controls.Remove(Control); } 

然后删除行

 panel.RowStyles.RemoveAt(rowCount-1); 

删除完整的表格 –

 tableLayoutPanel1.Controls.Clear(); tableLayoutPanel1.RowStyles.Clear(); 

再次 设置你的标题

  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列 – 1行

也许有人可以使用我的代码,工作正常…

您无法在tablelayoutpanel上完全删除行,但有一种解决方法:

  1. 如果您知道控件的名称,则可以更轻松地删除行中的所有控件,因为您可以调用dispose方法。
  2. 使用行样式方法将行的高度设置为2px (例如tablelayoutpanel1.Rowstyle(index).height=2

对我来说这有点奇迹,行无论行索引都完全折叠了。