簡體   English   中英

.Net TableLayoutPanel - 清除控件非常慢

[英].Net TableLayoutPanel – Clearing Controls is Very Slow

這很簡單。

我有一個TableLayoutPanel,它基於數據庫查詢填充了控件(只有標簽,按鈕和一些帶按鈕的面板)。 當需要刷新數據時,我使用TableLayoutPanel.Controls.Clear()。 不幸的是,這是一個非常緩慢的操作。 我希望它比填充表格的代碼更快,但速度至少要慢3到4倍。

我明確地證明了緩慢是在執行Controls.Clear()時執行此操作,因為在顯示消息框之后對TableLayoutPanel執行了一次操作(然后過程返回)。 控件從下往上明顯消失。 當記錄集用於重新填充TableLayoutPanel時,從上到下顯示的控件的速度幾乎比我看到的快。

我已經在做TableLayoutPanel.SuspendLayout()和ResumeLayout()。

在窗體上使用this.DoubleBuffered = true似乎沒有做任何事情。

我可以通過代碼處理整個控件並重新創建它,但這是一個很大的痛苦,並使一個漂亮的表單設計器GUI毫無意義。 我將不得不深入研究我在控件上設置的每個屬性並為其創建一行代碼(雖然我想我可以從設計器代碼本身中獲取它,但它仍然感覺不對)。

關於如何更快地完成工作的任何想法? 我甚至願意使用TableLayoutPanel之外的其他方法...我只需要自由地為每個單元格放置多個按鈕或禁止它能夠跨越表頭中的列。

C#在重繪時能否至少凍結整個表格,然后立即全部繪制?

我也使用TableLayoutPanels來解決速度緩慢的問題。 我沒有在表單上設置DoubleBuffered屬性,而是找到了最好的解決方案,即創建一個繼承自TableLayoutPanel的新類,並在該類的構造函數中啟用雙緩沖:

public class DoubleBufferedTableLayoutPanel : TableLayoutPanel
{
    public DoubleBufferedTableLayoutPanel()
    {
        DoubleBuffered = true;
    }
}

然后,在通常使用TableLayoutPanel的任何地方使用DoubleBufferedTableLayoutPanel。

這似乎適用於我的用途:

tableLayoutPanel.Visible = false;
tableLayoutPanel.Clear();
/* Add components to it */
tableLayoutPanel.Visible = true;

Chris Ryan的回答中,沒有必要將TableLayoutPanel子類化。 我有同樣的問題,通過反射設置屬性解決了它:

typeof(TableLayoutPanel)
   .GetProperty("DoubleBuffered",
      System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance)
   .SetValue(myTableLayoutPanel, true, null);

如果我要建立一些動態的gui,我總是會在代碼中這樣做。 但是在起點上我只是從設計師的虛擬形式和風格開始,每個控制方式我(或更好的客戶)喜歡。 然后我查看Designer.cs文件並將必要的屬性設置復制到一些工廠函數中

private TextBox CreateTextBox(string name, /* maybe other parameters */)
{
    var textBox = new TextBox();
    textBox.Name = name;
    //Other settings from given parameters...

    //Further settings which are all the same for these kind of control
    textBox.KeyDown += (sender, e) => {};

    return textBox;
}

所以我確保每個控件在我的GUI上都感覺和看起來一樣。 這將在我的表面中的每個級別上完成(從像TextBox這樣的小控件開始,然后轉到像GroupBoxTableLayoutPanel這樣的容器。

在某些情況下,這會導致工廠函數調用其他幾個工廠函數。 如果這成為現實,那么可以考慮將這些控件封裝到單個UserControl ,但是一如既往, 它取決於是否需要。

在我這邊,我只能鼓勵你將你的代碼從設計師中移到一個自編寫的函數中。 一開始它(一如既往)更多的工作,但之后更容易對布局做出更大的改變。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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