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

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

但同时水平滚动条也出现,即使项目宽度小于面板的宽度。 我怎么能阻止这个?

 int vertScrollWidth = SystemInformation.VerticalScrollBarWidth; tableLayoutPanel1.Padding = new Padding(0, 0, vertScrollWidth, 0); 

今天在这上面丢了一些毛,但我解决了,这就是我最终的结果:

  1. 创建一个inheritance自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. 将其添加到常规Panel。 在此面板上启用AutoScroll而不是MyTableLayoutPanel(如果您还没有,则在那里禁用它)。

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

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

奇怪的是,将TableLayoutPanel的右边距填充设置为1(不是滚动条的宽度 – 留下滚动条大小的间隙,正如您所期望的那样)完全解决了这个问题。 这是在C#2010 Express,.NET 4,Windows 8中。不知道这个kludge是否适用于其他变体。

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

在我看来TableLayoutPanel中的某些错误……或者它可能只是我拥有的控件和属性的特定组合(这是一个相当复杂的布局)。

问题是您的项目正好是布局面板的宽度,因此当Verticle滚动出现时它会切入控件,迫使水平滚动? 如果是这样,您可以在宽度方向上调整控件以考虑滚动条的可能性,或者可以在滚动条出现时尝试调整它们。

这在.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; } } 

我遇到过这个问题。

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

 tableLayoutPanel1.HorizontalScroll.Enabled = false; 

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

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

 tableLayoutPanel1.HorizontalScroll.Enabled = true; 

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

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