删除TableLayoutPanel中的特定行
我有编程式添加行的TableLayoutPanel。用户基本上选择一个属性,然后显示在表中以及一些控件。我认为我在这里有一个普遍的理解问题,我会尽力解释它。删除TableLayoutPanel中的特定行
每一行中的一个控件是一个'删除'按钮。该按钮应该删除它所在的行。我所做的是将一个事件处理程序添加到按钮并设置当前的行数。
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
属性只会导致行被从底部切掉。
解决方法是一个有点笨拙,多步骤获得错误:
- 从要删除
- 如果适用该行删除控件,移动这些控件到另一行。
- 移动其他行中的所有控件,这些控件位于要删除行的行之后。
- 最后,通过递减
RowCount
属性的值来删除最后一行。
快速谷歌搜索显示有人有written and shared code声称这样做。它在VB.NET中,但应该是easily translated到您的本地方言。
我承认,我已经知道只是踢,并设置RowHeight
行我希望“删除”0。这样,自动调整为你做的工作。不过,您可能仍想删除其中包含的控件。
下面给出了在给定位置移除行的代码。有一件事要提到:我们通过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--;
}
好。另请参见:[如何从tableLayoutPanel控件的特定行和列中移除控件?](https://social.msdn.microsoft.com/Forums/windows/zh-CN/568937e6-6b08-4b22-aeee-5a33159752c3/如何从列表中删除特定的行和列中的列表面板控件?forum = winforms&prof = required) – Mohsen 2018-01-13 17:50:36
删除现有的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行
也许有人可以用我的codesnipped,适当的工作好...
您可以通过在设计视图中手动设计表格布局来获取上述代码并复制VS生成的代码。查看表名后面的'YourForm.Designer.cs'。 – GoTo 2018-02-01 19:49:28
你不能完全删除tablelayoutpanel
上的一行,但有一个解决方法:
- 删除该行中的所有控件,如果知道控件的名称会导致您可以调用dispose方法,则更容易。
- 设置使用行式的方法 (例如
tablelayoutpanel1.Rowstyle(index).height=2
)对我来说这创造了奇迹的该行可能2px
的高度,连续被完全不管行索引倒塌行。
只是在这里明确指出,只有当你(至少)**隐藏**它们包含的所有控件时,最后一行才会被删除。否则,对“RowCount”的更改不起作用,行仍然可见。 – miroxlav 2014-05-31 18:21:45