.NET TableLayoutPanel:上一列宽度'太宽'

时间:2016-03-23 04:14:19

标签: c# .net vb.net visual-studio-2010 tablelayoutpanel

如果有更好的,更“传统的”解决方案,请告诉我:

根据Microsoft的说法,TableLayoutPanel列宽确定如下:

https://msdn.microsoft.com/en-us/library/system.windows.forms.tablelayoutpanel.columnstyles%28v=vs.110%29.aspx

  • 将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。请注意,原始列的最右侧列的宽度已经出错。

enter image description here

[截图1]

'Button38'(抱歉,懒惰)导致两个TableLayoutPanel控件都加宽了5个像素。请注意原始错误。

enter image description here

[截图2]

进一步扩大也说明了错误。请注意,派生类保持按钮宽度的更接近标准化。

enter image description here

同样,这只是我的代码解决'解决方案',因为我无法弄清楚。据我所知,由Microsoft发布的TableLayoutPanel实际上并没有在其列中分配宽度除法的“余数”。我很高兴看到它的工作代码这样做(假装我是个白痴并发布所有代码,好像我什么都不知道。)

0 个答案:

没有答案