我有几个 TableLayoutPanel,每一个都在两列中显示一类名称/值信息——一列带有信息标签,另一列带有数据标签。
在每一个中,我都将第一列设置为自动调整大小并右对齐所有标签,效果很好。但是,它对每个 TableLayoutPanel 单独工作(显然),看起来像这样:
TableLayoutPanel 1:
+--------+--------+
| Name 1 | Data 1 |
+--------+--------+
| Name 2 | Data 2 |
+--------+--------+
| Name 3 | Data 3 |
+--------+--------+
TableLayoutPanel 2:
+------------------+--------+
| Long Name 1 | Data 1 |
+------------------+--------+
| Very Long Name 2 | Data 2 |
+------------------+--------+
| Long Name 3 | Data 3 |
+------------------+--------+
我正在寻找一种在自动调整所有第一列时考虑所有名称标签的方法,所以它看起来像这样:
TableLayoutPanel 1:
+------------------+--------+
| Name 1 | Data 1 |
+------------------+--------+
| Name 2 | Data 2 |
+------------------+--------+
| Name 3 | Data 3 |
+------------------+--------+
TableLayoutPanel 2:
+------------------+--------+
| Long Name 1 | Data 1 |
+------------------+--------+
| Very Long Name 2 | Data 2 |
+------------------+--------+
| Long Name 3 | Data 3 |
+------------------+--------+
我不能将所有数据放在一个表中,因为每个表代表不同类别的信息,并且位于带有一组可折叠面板的自定义控件中(因此您可以单独显示或隐藏每个类别)。
我一直在尝试通过覆盖容器控件 OnLayout()、将所有 TableLayoutPanels 的第一列设置为自动调整大小、获取它们的所有宽度、找到最大值,然后将它们的所有第一列设置为固定大小来实现这一点的最大宽度。这可行,但每次布局发生时看起来都很糟糕,因为所有列都跳转到自动调整大小,然后又回到固定大小。
我假设我将不得不为每个表挂钩 ControlAdded 和 ControlRemoved,然后为每个子控件挂钩 SizeChanged,以了解任何子控件的大小何时更改,然后以某种方式手动设置列宽,但我我不确定如何可靠地获得正确的宽度。
我尝试了第一种方法的变体 - 在第一列中的所有控件上使用 GetPreferredSize() ,以尝试找到最大宽度,然后将所有第一列设置为固定大小,但它似乎返回的宽度稍微到小。我应该应用一些额外的间距吗?
有谁知道要求 TableLayoutPanel 执行自动大小计算而不实际应用它们的任何方式?或者,也许,对桌子撒谎以“假装”有一定宽度的控制,只是为了考虑到它?我不能添加实际的控件,因为它会想要为它们分配更多的单元格。我尝试使用 ILSpy 查看源代码,但它并不漂亮。似乎大部分工作都是由 TableLayout 类完成的,这当然是内部的,我无法理解它在做什么。
感谢您的任何想法...