C# 如何在winforms中禁用表格面板的水平滚动条
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/2197452/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to disable horizontal scrollbar for table panel in winforms
提问by Nagu
Hi I've a tablelayoutpanel and I'm binding controls to it dynamically. When the item count exceeds the height of panel obviously vertical scroll bar appearing there is no problem.
嗨,我有一个 tablelayoutpanel,我正在动态地将控件绑定到它。当项目数超过面板高度时,出现明显的垂直滚动条是没有问题的。
But the same time horizontal scroll bar is also appearing even the items width is less than the width of panel. How can i prevent this?
但同时水平滚动条也会出现,即使项目宽度小于面板宽度。我怎样才能防止这种情况?
回答by Kevin Stafford
Is the issue that your items are exactly the width of the the layout panel, so that when the verticle scroll appears it cuts into your controls a bit, forcing the horizontal scroll? If so, you can either make your controls smaller width-wise to account for the possibility of the scrollbar, or you can try to adjust them when the scroll bar appears.
问题是您的项目恰好是布局面板的宽度,因此当出现垂直滚动时,它会切入您的控件,从而强制水平滚动?如果是这样,您可以使控件在宽度方向上更小以考虑滚动条的可能性,或者您可以尝试在滚动条出现时调整它们。
回答by Sangram Nandkhile
I have experienced this problem.
我遇到过这个问题。
A lot of people also get same problem in Datagrid. But, there is no exact solution for this question you will have to manually decide the the dimension of the panel according to use.
很多人在 Datagrid 中也遇到了同样的问题。但是,这个问题没有确切的解决方案,您必须根据使用情况手动确定面板的尺寸。
tableLayoutPanel1.HorizontalScroll.Enabled = false;
this will disable the horizontal scroll bar but you will have to manually adjust the dimension of the table layout panel.
这将禁用水平滚动条,但您必须手动调整表格布局面板的尺寸。
Another way could be calculating the possible width of tablelayoutpanel during run time and if it greater than the value you have set then you can enable it.
另一种方法可能是在运行时计算 tablelayoutpanel 的可能宽度,如果它大于您设置的值,那么您可以启用它。
tableLayoutPanel1.HorizontalScroll.Enabled = true;
回答by Pinaskee
int vertScrollWidth = SystemInformation.VerticalScrollBarWidth;
tableLayoutPanel1.Padding = new Padding(0, 0, vertScrollWidth, 0);
回答by Magnus
Lost a few hairs on this today, but I solved it and this is what I ended up with:
今天失去了一些头发,但我解决了它,这就是我最终的结果:
Create a new class that inherits from TableLayoutPanel (lets call it MyTableLayoutPanel), and override the MaximumSize property like this:
public override Size MaximumSize { get { if (Parent != null) return new Size(Parent.Width, 0); else return base.MaximumSize; } set { base.MaximumSize = value; } }
You could of course make it more general purpose by adding another property that decides whether or not you should return the altered MaximumSize or not, but hopefully that much is obvious to anyone that's reading this.
Change the TableLayoutPanel that you've got to the new MyTableLayoutPanel type.
Add it to a regular Panel. Enable AutoScroll on this Panel instead of the MyTableLayoutPanel (disable it there if you haven't already).
Set the MyTableLayoutPanel AutoSize property to true and its Anchor property to Left, Right and Top.
创建一个从 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。
回答by Jez Clark
I had this problem with a docked TableLayoutPanel containing docked GroupBoxes and a single Column set to 100% width. I didn't want to set a manual size for these - I wanted them to resize along with the form.
我有一个停靠的 TableLayoutPanel 包含停靠的 GroupBoxes 和一个设置为 100% 宽度的单个列的问题。我不想为这些设置手动大小 - 我希望它们与表单一起调整大小。
Strangely, setting the Right Padding of the TableLayoutPanel to 1 (not the width of the scrollbar - that left a scrollbar-sized gap, as you would expect) solved the issue completely. This is in C# 2010 Express, .NET 4, Windows 8. No idea if this kludge works on other variations.
奇怪的是,将 TableLayoutPanel 的 Right Padding 设置为 1(不是滚动条的宽度 - 如您所料,这会留下滚动条大小的间隙)完全解决了这个问题。这是在 C# 2010 Express、.NET 4、Windows 8 中。不知道这个 kludge 是否适用于其他变体。
Setting the padding to 0 seemedto solve the problem in the IDE, but the problem still existed when actually running.
在IDE中设置padding为0似乎解决了问题,但实际运行时问题依然存在。
Smells like some sort of bug in the TableLayoutPanel to me...or maybe it's just the particular combination of controls and properties I have (it's a pretty complicated layout).
对我来说,这听起来像是 TableLayoutPanel 中的某种错误……或者这可能只是我拥有的控件和属性的特定组合(这是一个非常复杂的布局)。
回答by B H
This worked perfectly in .NET 3.5 where the other solutions did not give me exactlywhat I wanted:
这在 .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;
}
}
回答by LarnRegis
I solved this by using a simple Panel into which i docked the tablelayoutpanel. Then I made not the TLP have the scrollbars, but the Panel. This works fine for me.
我通过使用一个简单的面板解决了这个问题,我将 tablelayoutpanel 停靠在其中。然后我让 TLP 没有滚动条,而是面板。这对我来说很好用。
I assume the TLP with the different columns and rows has issues to calculate the width for each and thus shows a vertical scrollbar even when not necessary.
我假设具有不同列和行的 TLP 在计算每个列和行的宽度时存在问题,因此即使在不需要时也会显示垂直滚动条。
回答by xiangbin.pang
I found a perfect solution about this problem by using reflect. You can try following codes:
我通过使用反射找到了关于这个问题的完美解决方案。您可以尝试以下代码:
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;
}