Как избежать мерцания в TableLayoutPanel в c#.net

Я использую TableLayoutPanel для целей маркировки посещаемости. Я добавил элементы управления (панель и метку) внутри этой TableLayoutPanel и создал для них события. В некоторых условиях я очистил все элементы управления и приступил к привязке тех же элементов управления в другом положении TableLayoutPanel. При повторной привязке элементов управления TableLayoutPanel мерцает и слишком медленно инициализируется.

5 ответов


приостановить макет, пока не будут добавлены все элементы управления.

TableLayoutPanel panel = new TabelLayoutPanel();
panel.SuspendLayout();

// add controls

panel.ResumeLayout();

также посмотрите на использование двойной буферизации. Вам нужно будет создать подкласс TableLayoutPanel. Пример здесь.


это отлично сработало для меня удалить мерцание из-за TableLayoutPanel & Panel в windows form

вот что в этой ссылке (скопировал дословно)

вполне извлеките мелькать должный к TableLayoutPanel & панели внутри windows form выглядит следующим образом:=- 1. Задайте свойство двойной буферизации Form =true. 2. Вставьте следующие 2 функции в форму.cs

#region .. Double Buffered function ..
   public static void SetDoubleBuffered(System.Windows.Forms.Control c)
    {
        if (System.Windows.Forms.SystemInformation.TerminalServerSession)
            return;
        System.Reflection.PropertyInfo aProp = typeof(System.Windows.Forms.Control).GetProperty("DoubleBuffered",
        System.Reflection.BindingFlags.NonPublic |
        System.Reflection.BindingFlags.Instance);
        aProp.SetValue(c, true, null);
    }

   #endregion


   #region .. code for Flucuring ..

   protected override CreateParams CreateParams
    {
        get
        {
            CreateParams cp = base.CreateParams;
            cp.ExStyle |= 0x02000000;
            return cp;
        }
    }

    #endregion
  1. вызов SetDoubleBuffered(“TableLaoutPannel_controlName”) для каждого TableLayoutPannel,Pannel, Splitcontainer, Datagridview и все контейнера контроли.

спасибо Ришикешлате Опубликовано 16-Feb-14 20:11pm


используйте эту панель для установки свойства dBuffer true

public partial class MyTableLayoutPanel : TableLayoutPanel
{
        public MyTableLayoutPanel()
        {
            InitializeComponent();
        }

        public MyTableLayoutPanel(IContainer container)
        {
            container.Add(this);
            InitializeComponent();
        }

        /// <summary>
        /// Double buffer
        /// </summary>
        [Description("Double buffer")]
        [DefaultValue(true)]
        public bool dBuffer
        {
            get { return this.DoubleBuffered; }
            set { this.DoubleBuffered = value; }
        }
}

этот код, представленный по другому вопросу, прибил его, он использует вызов API для установки перерисовки TableLayoutPanel.

https://stackoverflow.com/a/10038782/197765


как улучшение вышеизложенного, у меня были лучшие результаты с:

    TableLayoutPanel panel = new TabelLayoutPanel();
    panel.SuspendLayout();
    panel.StopPaint();

    // add controls

    panel.ResumePaint();
    panel.ResumeLayout();