[嗨,我有一个tablelayoutpanel,我正在动态绑定控件。当项目数超过面板高度时,显然出现垂直滚动条是没有问题的。
但是同时,即使项目的宽度小于面板的宽度,也会出现水平滚动条。我该如何预防?
int vertScrollWidth = SystemInformation.VerticalScrollBarWidth;
tableLayoutPanel1.Padding = new Padding(0, 0, vertScrollWidth, 0);
今天少了点毛,但是我解决了,这就是我最终得到的结果:
创建一个继承自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,但希望对阅读此文件的人来说显而易见。
将您拥有的TableLayoutPanel更改为新的MyTableLayoutPanel类型。
将其添加到常规面板中。在此面板上启用AutoScroll而不是MyTableLayoutPanel(如果尚未启用,请在此处禁用)。
将MyTableLayoutPanel AutoSize属性设置为true,并将其Anchor属性设置为Left,Right和Top。
我在停靠的TableLayoutPanel中包含停靠的GroupBoxes和设置为100%宽度的单个Column时遇到了这个问题。我不想为此设置手动大小-我希望它们随表格一起调整大小。
奇怪的是,将TableLayoutPanel的Right Padding设置为1(而不是滚动条的宽度-就像您期望的那样,它留下了滚动条大小的间隙)完全解决了这个问题。这是在C#2010 Express,.NET 4,Windows 8中。不知道此合并是否可以在其他版本上使用。
将填充设置为0 似乎以解决IDE中的问题,但是在实际运行时问题仍然存在。
对我来说,闻起来就像是TableLayoutPanel中的某种错误……或者也许只是我拥有的控件和属性的特定组合(这是一个非常复杂的布局)。
您的项目是否恰好是布局面板的宽度的问题,因此当垂直滚动出现时,它会切入您的控件中,从而迫使水平滚动?如果是这样,可以将控件的宽度减小,以解决滚动条的可能性,也可以尝试在滚动条出现时进行调整。
这在.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拥有滚动条,而是拥有面板。这对我来说很好。
我假设具有不同列和行的TLP在计算每个列的宽度时遇到问题,因此即使没有必要也显示垂直滚动条。
我通过使用反射找到了关于此问题的完美解决方案。您可以尝试以下代码:
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;
}