嗨,我有一个 tablelayoutpanel,我正在动态地将控件绑定到它。当项目数超过面板的高度时,明显出现垂直滚动条没有问题。
但同时水平滚动条也会出现,即使项目宽度小于面板宽度。我怎样才能防止这种情况?
嗨,我有一个 tablelayoutpanel,我正在动态地将控件绑定到它。当项目数超过面板的高度时,明显出现垂直滚动条没有问题。
但同时水平滚动条也会出现,即使项目宽度小于面板宽度。我怎样才能防止这种情况?
int vertScrollWidth = SystemInformation.VerticalScrollBarWidth;
tableLayoutPanel1.Padding = new Padding(0, 0, vertScrollWidth, 0);
我有一个停靠的 TableLayoutPanel 包含停靠的 GroupBoxes 和一个设置为 100% 宽度的列的问题。我不想为这些设置手动大小 - 我希望它们与表单一起调整大小。
奇怪的是,将 TableLayoutPanel 的 Right Padding 设置为 1(不是滚动条的宽度 - 如您所料,这会留下滚动条大小的间隙)完全解决了这个问题。这是在 C# 2010 Express、.NET 4、Windows 8 中。不知道这个 kludge 是否适用于其他变体。
将padding设置为0似乎可以解决IDE中的问题,但实际运行时问题依然存在。
对我来说,在 TableLayoutPanel 中闻起来像是某种错误......或者它可能只是我拥有的控件和属性的特定组合(这是一个非常复杂的布局)。
今天失去了一些头发,但我解决了它,这就是我最终得到的:
创建一个继承自 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。
问题是您的项目恰好是布局面板的宽度,因此当垂直滚动出现时它会切入您的控件,从而强制水平滚动?如果是这样,您可以将控件宽度缩小以考虑滚动条的可能性,或者您可以在滚动条出现时尝试调整它们。
这在 .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;
}
这些解决方案都不适用于每种情况。我最终需要它们的组合:
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);
}
重要:这可以在表单加载时调用一次,但也必须在布局调整大小事件中调用。
我知道这个问题已经很久了。但可能其他人可能会从对我有用的解决方案中受益。
诀窍是,如果 auto scroll 属性为 true,则禁用水平滚动条不会执行任何操作。因此,只需禁用自动滚动,禁用水平滚动条,然后再次将自动滚动切换为 true。这对我有用。
只需将以下代码添加到某个地方,例如构造函数或表单加载事件。
tableLayoutPanel1.AutoScroll = false;
tableLayoutPanel1.HorizontalScroll.Enabled = false;
tableLayoutPanel1.AutoScroll = true;