簡體   English   中英

如何在winforms中禁用表格面板的水平滾動條

[英]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 中的某種錯誤……或者這可能只是我擁有的控件和屬性的特定組合(這是一個非常復雜的布局)。

今天失去了一些頭發,但我解決了它,這就是我最終的結果:

  1. 創建一個從 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. 將其添加到常規面板。 在此面板上啟用 AutoScroll 而不是 MyTableLayoutPanel(如果您還沒有在那里禁用它)。

  4. 將 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM