如何在winforms中禁用表格面板的水平滚动条

问题描述 投票:17回答:8

[嗨,我有一个tablelayoutpanel,我正在动态绑定控件。当项目数超过面板高度时,显然出现垂直滚动条是没有问题的。

但是同时,即使项目的宽度小于面板的宽度,也会出现水平滚动条。我该如何预防?

c# winforms scrollbar tablelayout
8个回答
39
投票
int vertScrollWidth = SystemInformation.VerticalScrollBarWidth;

tableLayoutPanel1.Padding = new Padding(0, 0, vertScrollWidth, 0);

7
投票

今天少了点毛,但是我解决了,这就是我最终得到的结果:

  1. 创建一个继承自TableLayoutPanel的新类(我们将其称为MyTableLayoutPanel),并像这样重写MaximumSize属性:

    public override Size MaximumSize
    {
        get
        {
            if (Parent != null)
                return new Size(Parent.Width, 0);
            else
                return base.MaximumSize;
        }
        set
        {
            base.MaximumSize = value;
        }
    }
    

    您当然可以通过添加另一个属性来确定它是否更通用,该属性决定是否应返回更改后的MaximumSize,但希望对阅读此文件的人来说显而易见。

  2. 将您拥有的TableLayoutPanel更改为新的MyTableLayoutPanel类型。

  3. 将其添加到常规面板中。在此面板上启用AutoScroll而不是MyTableLayoutPanel(如果尚未启用,请在此处禁用)。

  4. 将MyTableLayoutPanel AutoSize属性设置为true,并将其Anchor属性设置为Left,Right和Top。


6
投票

我在停靠的TableLayoutPanel中包含停靠的GroupBoxes和设置为100%宽度的单个Column时遇到了这个问题。我不想为此设置手动大小-我希望它们随表格一起调整大小。

奇怪的是,将TableLayoutPanel的Right Padding设置为1(而不是滚动条的宽度-就像您期望的那样,它留下了滚动条大小的间隙)完全解决了这个问题。这是在C#2010 Express,.NET 4,Windows 8中。不知道此合并是否可以在其他版本上使用。

将填充设置为0 似乎以解决IDE中的问题,但是在实际运行时问题仍然存在。

对我来说,闻起来就像是TableLayoutPanel中的某种错误……或者也许只是我拥有的控件和属性的特定组合(这是一个非常复杂的布局)。


1
投票

您的项目是否恰好是布局面板的宽度的问题,因此当垂直滚动出现时,它会切入您的控件中,从而迫使水平滚动?如果是这样,可以将控件的宽度减小,以解决滚动条的可能性,也可以尝试在滚动条出现时进行调整。


1
投票

这在.NET 3.5中非常有效,其他解决方案没有给我精确地我想要的东西:

  if (this.TableLayoutPanel1.HorizontalScroll.Visible)
  {
    int newWid = this.TableLayoutPanel1.Width -
                  (2 * SystemInformation.VerticalScrollBarWidth);
    //this.TableLayoutPanel1.Padding = new Padding(0, 0, newWid, 0);
    foreach (Control ctl in this.TableLayoutPanel1.Controls)
    {
      ctl.Width = newWid;
    }
  }

1
投票

我遇到了这个问题。

很多人在Datagrid中也遇到同样的问题。但是,此问题没有确切的解决方案,您将不得不根据用途手动确定面板的尺寸。

tableLayoutPanel1.HorizontalScroll.Enabled = false;

这将禁用水平滚动条,但您必须手动调整表格布局面板的尺寸。

另一种方法可能是计算运行时tablelayoutpanel的可能宽度,如果它大于您设置的值,则可以启用它。

tableLayoutPanel1.HorizontalScroll.Enabled = true;

1
投票

我通过使用一个简单的面板解决了这个问题,将tablelayoutpanel停靠在其中。然后,我不让TLP拥有滚动条,而是拥有面板。这对我来说很好。

我假设具有不同列和行的TLP在计算每个列的宽度时遇到问题,因此即使没有必要也显示垂直滚动条。


0
投票

我通过使用反射找到了关于此问题的完美解决方案。您可以尝试以下代码:

static MethodInfo funcSetVisibleScrollbars;
static EventHandler ehResized;

public static void DisableHorizontalScrollBar(this ScrollableControl ctrl)
{
     //cache the method info
     if(funcSetVisibleScrollbars == null)
     {
           funcSetVisibleScrollbars = typeof(ScrollableControl).GetMethod("SetVisibleScrollbars",
                BindingFlags.Instance | BindingFlags.NonPublic);
     }

     //init the resize event handler
     if(ehResized == null)
     {
           ehResized = (s, e) =>
           {
                funcSetVisibleScrollbars.Invoke(s, new object[] { false, (s as ScrollableControl).VerticalScroll.Visible });
           };
     }

     ctrl.Resize -= ehResized;
     ctrl.Resize += ehResized;
}
© www.soinside.com 2019 - 2024. All rights reserved.