17

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

但同时水平滚动条也会出现,即使项目宽度小于面板宽度。我怎样才能防止这种情况?

4

10 回答 10

41
int vertScrollWidth = SystemInformation.VerticalScrollBarWidth;

tableLayoutPanel1.Padding = new Padding(0, 0, vertScrollWidth, 0);
于 2011-07-02T07:25:08.767 回答
9

我有一个停靠的 TableLayoutPanel 包含停靠的 GroupBoxes 和一个设置为 100% 宽度的列的问题。我不想为这些设置手动大小 - 我希望它们与表单一起调整大小。

奇怪的是,将 TableLayoutPanel 的 Right Padding 设置为 1(不是滚动条的宽度 - 如您所料,这会留下滚动条大小的间隙)完全解决了这个问题。这是在 C# 2010 Express、.NET 4、Windows 8 中。不知道这个 kludge 是否适用于其他变体。

将padding设置为0似乎可以解决IDE中的问题,但实际运行时问题依然存在。

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

于 2014-02-26T13:09:45.100 回答
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。

于 2011-08-24T12:05:03.440 回答
1

问题是您的项目恰好是布局面板的宽度,因此当垂直滚动出现时它会切入您的控件,从而强制水平滚动?如果是这样,您可以将控件宽度缩小以考虑滚动条的可能性,或者您可以在滚动条出现时尝试调整它们。

于 2010-02-04T05:28:26.500 回答
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;
    }
  }
于 2014-09-11T14:54:36.873 回答
1

我遇到过这个问题。

很多人在 Datagrid 中也遇到同样的问题。但是,对于这个问题没有确切的解决方案,您必须根据使用情况手动确定面板的尺寸。

tableLayoutPanel1.HorizontalScroll.Enabled = false;

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

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

tableLayoutPanel1.HorizontalScroll.Enabled = true;
于 2010-12-01T08:22:44.720 回答
1

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

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

于 2015-10-01T13:36:56.333 回答
1

我通过使用反射找到了一个完美的解决方案。您可以尝试以下代码:

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;
}
于 2019-11-12T05:51:54.257 回答
0

这些解决方案都不适用于每种情况。我最终需要它们的组合:

public void hideHorizontalScrollBar(ref TableLayoutPanel pan)
{
    if (!pan.HorizontalScroll.Visible)
        return;
    pan.Padding = new Padding(0, 0, 0, 0);
    while (!!pan.HorizontalScroll.Visible || pan.Padding.Right >= SystemInformation.VerticalScrollBarWidth * 2)
    pan.Padding = new Padding(0, 0, pan.Padding.Right + 1, 0);
}

重要:这可以在表单加载时调用一次,但也必须在布局调整大小事件中调用。

于 2020-11-09T12:39:42.930 回答
0

我知道这个问题已经很久了。但可能其他人可能会从对我有用的解决方案中受益。

诀窍是,如果 auto scroll 属性为 true,则禁用水平滚动条不会执行任何操作。因此,只需禁用自动滚动,禁用水平滚动条,然后再次将自动滚动切换为 true。这对我有用。

只需将以下代码添加到某个地方,例如构造函数或表单加载事件。

tableLayoutPanel1.AutoScroll = false;
tableLayoutPanel1.HorizontalScroll.Enabled = false;
tableLayoutPanel1.AutoScroll = true;
于 2020-12-23T22:51:58.973 回答