如果有更好的,更“传统的”解决方案,请告诉我:
根据Microsoft的说法,TableLayoutPanel列宽确定如下:
将ColumnStyle设置为Absolute的列首先考虑,并分配它们的固定宽度。
ColumnStyle设置为AutoSize的列的大小与其内容相同。
剩余空间在ColumnStyle设置为Percent的列之间分配。
我不相信,特别是关于第三点。在最近的(贪婪)实验中,我经历了以下几点:
[属性:TableLayoutPanel]
AutoScroll = False(尝试为True)
AutoSize = False(尝试为True)
所有ColumnStyle SizeType属性设置为“Percent”(尝试其他所有可组合的组合)
在这种情况下,随着TableLayoutPanel的大小调整,最右边的列总是被赋予等式的其余部分:
W / Ncolumns = ColumnWidth
其中:
W = TableLayoutPanel的宽度
Ncolumns =列数
在所有测试中,最右边的列最终比其余列宽。这适用于.NET 2.0和.NET 4.0控件。
在研究中,我发现了一些广告解决方案,例如在其余部分的右侧添加一个未使用的列,并为其指定一个SizeType = Absolute,Size = 0属性。在我的测试中,这在调整大小期间也是无效的。此外,如果这是某种“解决方案”,我会非常惊讶。
因此,在我的测试中没有互联网找到的解决方案,并且鉴于MS可能会认为这是一个“功能” https://social.msdn.microsoft.com/Forums/vstudio/en-US/fea60d24-70d2-4cd8-91f8-57ae23ac9972/table-layout-panel-column-size-problem?forum=vbgeneral 我决定编写自己的继承类。
我承认下面的代码不精炼/可能更有效/需要更多的牛铃。我没关系,因为在它下面的截图中,我得到了我想要的东西:一个TableLayoutPanel,它实际上保持所有包含的控件尽可能接近均匀大小。 “余数”错误分布在包含的控件上。
Public Class MyOwnTableLayoutPanel
Inherits System.Windows.Forms.TableLayoutPanel
Public Shadows Sub OnResize() Handles Me.Resize
Dim w As Double = Me.Width / Me.ColumnStyles.Count
'// get 'normal' width (sans-remainder distribution)
w = Math.Truncate(w)
Dim remainder As Integer = Me.Width Mod Me.ColumnStyles.Count
Dim pointer As Integer = 1
'// distribute the 'remainder' across some of the controls;
' should result, usually, in not more than one pixel deviation from 'normal'
For i As Integer = 0 To Me.ColumnStyles.Count - 1
Me.ColumnStyles(i).SizeType = SizeType.Absolute
pointer += 1
If Not pointer > remainder Then
Me.ColumnStyles(i).Width = w + 1
Else
Me.ColumnStyles(i).Width = w
End If
Next
End Sub
End Class
[Screenshot 0]
在这里看到,顶部的TableLayoutPanel是我的派生类。较低的是原始的MS Class。请注意,原始列的最右侧列的宽度已经出错。
[截图1]
'Button38'(抱歉,懒惰)导致两个TableLayoutPanel控件都加宽了5个像素。请注意原始错误。
[截图2]
进一步扩大也说明了错误。请注意,派生类保持按钮宽度的更接近标准化。
同样,这只是我的代码解决'解决方案',因为我无法弄清楚。据我所知,由Microsoft发布的TableLayoutPanel实际上并没有在其列中分配宽度除法的“余数”。我很高兴看到它的工作代码这样做(假装我是个白痴并发布所有代码,好像我什么都不知道。)