C# WinForms TableLayoutPanel在一行中添加两个元素时行为怪异

8e2ybdfx  于 2023-05-18  发布在  C#
关注(0)|答案(1)|浏览(203)

想要以这样的方式使用WinForms的TableLayoutPanel:每行有两列,一列占80%,第二列占20%。在第一列中,有一个TextBox,在第二列中:一个按钮。我已经做了一个按钮,将这样的行添加到表中,但是,正如视频中所看到的,这变得***可怕***。在此之前,我使用FlowLayoutPanel,但被建议使用Table-代替。下面是一个演示视频:https://youtu.be/4hcBAeWCtTQ|下面是添加按钮代码:

private void manual_packages_add_Click(object sender, EventArgs e) {
  static Size MulSize(Size sz, Size accord, int percent) {
    static float Percent(float n, int p) => n * (p / 100);

    SizeF origF = (SizeF)sz;
    SizeF accordF = (SizeF)accord;
    origF.Height += Percent(accordF.Height, percent);
    return origF.ToSize();
  }

  TextBox tbx = new() {
    Name = $"manual_packages_pkg{manual_nextPkgTbxIndex++}",
    Size = new((int)Math.Round(manual_packages_list.ColumnStyles[0].Width),
               (int)Math.Round(manual_packages_list.RowStyles[0].Height)),
    MaxLength = 34,
    BorderStyle = BorderStyle.Fixed3D,
  };
  Button rm = new() { Name = $"manual_packages_rm{manual_nextPkgTbxIndex}",
                      Text = "i suffer 💀💀💀💀💀" };
  manual_packages_list.Controls.Add(tbx, 0, manual_packages_list.RowCount++);
  manual_packages_list.Controls.Add(rm, 1, manual_packages_list.RowCount++);

  // sizing
  Control? container = tbx.Parent;
  bool firstIter = true;
  while (true) {
    container = firstIter ? container : container.Parent;
    if (container == null)
      break;
    container.Size = MulSize(container.Size, tbx.Size, 100);
    firstIter = false;
  }
}

  • 初始状态 *

  • 点击了3次添加按钮 *

  • 点击添加按钮4次以上 *

我试着删除尺寸(这没有产生任何好处),我编码它对齐所有东西,但它没有工作。

smdnsysy

smdnsysy1#

您应该做的是在TableLayoutPanel中显示边框,您会看到实际上每行只添加了一个控件,而不是两个。问题在这里:

manual_packages_list.Controls.Add(tbx, 0, manual_packages_list.RowCount++);
manual_packages_list.Controls.Add(rm, 1, manual_packages_list.RowCount++);

您正在增加这两行中的manual_packages_list.RowCount,因此每个控件都将添加到不同的行中。如果您希望将这两个控件添加到同一行,则不能在添加第一个控件后增加行数。至少,删除第一行的增量:

manual_packages_list.Controls.Add(tbx, 0, manual_packages_list.RowCount);
manual_packages_list.Controls.Add(rm, 1, manual_packages_list.RowCount++);

话虽如此,我不认为这是真正的方法。我认为您应该从行数1开始,然后,当您想向第二行添加控件时,您应该先增加行数,然后添加两个控件。实际上看起来像这样:

manual_packages_list.Controls.Add(tbx, 0, ++manual_packages_list.RowCount);
manual_packages_list.Controls.Add(rm, 1, manual_packages_list.RowCount);

按照您(打算)的方式,您已经在表中有一个空行,其中没有控件,然后您向该行添加控件,然后添加另一个空行。如果默认情况下没有空行,只在需要时添加一个空行,然后向其中添加控件,这会更有意义。

相关问题