c# - 删除 TableLayoutPanel 中的特定行

标签 c# .net 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属性(property)。仅这一点就够奇怪的了;该属性看起来确实应该是只读的,每次我看到它时,执行此操作的代码在我看来都是错误的。

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

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

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

Google 快速搜索显示有人拥有 written and shared code声称要这样做。它在 VB.NET 中,但应该是 easily translated变成你的母语。

我承认,众所周知,我只是将我希望“删除”的行的 RowHeight 设置为 0。这样,自动调整大小就会为您完成工作。不过,您可能仍想删除它包含的控件。

关于c# - 删除 TableLayoutPanel 中的特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15535214/

相关文章:

c# - SendToAsync 内存泄漏?

c# - Microsoft.Bcl.Immutable 中的 ImmutableList<T> Remove 方法性能低下

c# - 带有 Windows 10 通用应用程序的 iTextSharp

.net - Box API 2.0 下载文件

c# - 无法更改 javascript 中设置的 cookie 值?

c# - ListBox 按项目高度自动调整大小

c# - 将控件添加到 TableLayoutPanel 的快速方法

c# - 如何在 C# Visual Studio 调试器中显示 1000 分隔符

c# - 以编程方式确定当前域 Controller

c# - 如何避免c#.net中TableLayoutPanel的闪烁