我有几个TableLayoutPanels,每个都有两列显示名称/值信息的类别-一列带有信息标签,一列带有数据标签。

在每个标签中,我都将第一列设置为自动调整所有标签的大小并使其右对齐,这很好用。但是,它与每个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类完成的,它当然是内部的,我无法理解它在做什么。

感谢您的任何想法...

最佳答案

您可以使用Graphics.Measurestring确定像素的长度,而无需实际绘制它。有一些slight imperfections with it,因此您可以考虑添加或删除一些填充。经过一两次测试,您可以非常接近。就我所知,这是适当的,并且不涉及标签中的文本。

另外,试图找到一种方法来获取TableLayoutPanel来计算大小而不以可视方式显示它,这听起来像是您试图将其修改为某些本来不是设计好的事情。

关于c# - 同步TableLayoutPanel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8102215/

10-10 13:52