[英]How to disable horizontal scrollbar for table panel in winforms
嗨,我有一個 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 是否適用於其他變體。
在IDE中設置padding為0似乎解決了問題,但實際運行時問題依然存在。
對我來說,這聽起來像是 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;
}
}
我通過使用一個簡單的面板解決了這個問題,我將 tablelayoutpanel 停靠在其中。 然后我讓 TLP 沒有滾動條,而是面板。 這對我來說很好用。
我假設具有不同列和行的 TLP 在計算每個列和行的寬度時存在問題,因此即使在不需要時也會顯示垂直滾動條。
我遇到過這個問題。
很多人在 Datagrid 中也遇到了同樣的問題。 但是,這個問題沒有確切的解決方案,您必須根據使用情況手動確定面板的尺寸。
tableLayoutPanel1.HorizontalScroll.Enabled = false;
這將禁用水平滾動條,但您必須手動調整表格布局面板的尺寸。
另一種方法可能是在運行時計算 tablelayoutpanel 的可能寬度,如果它大於您設置的值,那么您可以啟用它。
tableLayoutPanel1.HorizontalScroll.Enabled = true;
我通過使用反射找到了關於這個問題的完美解決方案。 您可以嘗試以下代碼:
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。 這對我有用。
只需將以下代碼添加到某個地方,例如構造函數或 Form Load 事件。
tableLayoutPanel1.AutoScroll = false;
tableLayoutPanel1.HorizontalScroll.Enabled = false;
tableLayoutPanel1.AutoScroll = true;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.