-2

У меня есть tableLayoutPanel, который я использую с Windows Form. Элемент управления заполняется из datatable, который содержит данные сервера sql. Я уже подтвердил, что заявление select не является проблемой.Любой способ оптимизации заполнения таблицыLayoutPanel?

Частота данных часто обновляется, поэтому часто обновляется tableLayoutPanel. Это, по существу, хорошо работает, но доходит до того, что он становится немного медленнее, и мерцание становится более заметным.

Everytime Мне нужно, чтобы обновить элемент управления, этот код выполняется:

public void FillTlp() 
{ 
    tableLayoutPanel1.Controls.Clear(); 
    tableLayoutPanel1.ColumnStyles.Clear(); 

    foreach (DataRow r in DT.Rows) 
    { 
     UcColor button = new UcColor(r); 
     tableLayoutPanel1.Controls.Add(button);//, colNumNew, rowNum); 
    } 
    this.Controls.Add(tableLayoutPanel1); 
}  

Поскольку всегда будет иметь 8 строк, я выполнить следующий код в форме конструктора только один раз, но я не вижу много пользы:

public FormDoctorMonitor() 
{ 
    tableLayoutPanel1.RowStyles.Clear(); 
    tableLayoutPanel1.RowCount = 8; 
    FillTlp(); 
} 

Как еще можно оптимизировать заполнение tableLayoutPanel?

Спасибо.

+0

Очевидный вопрос: почему «обновить» на самом деле «построить с нуля»? Измените только то, что нужно изменить. – DonBoitnott

+0

Без [MCVE] (http://stackoverflow.com/help/mcve) трудно сказать, в чем проблема. Несколько советов: ** 1 - ** Перед добавлением новых элементов управления на панель сначала добавьте предыдущие элементы управления «Dispose». В настоящее время вы удаляете их только. Вы должны выполнять удаление и удаление. ** 2 - ** Вызов 'panel.SuspendLayout();' перед удалением элементов управления и вызовом 'panel.ResumeLayout (true);' после добавления новых элементов управления может помочь. –

+0

@RezaAghaei, где я должен добавить 'tableLayoutPanel1.Dispose();'? Если я добавлю его в начале, я получу ошибку времени выполнения «Не удается получить доступ к удаленному объекту». Я изменил образец кода с вашими предложениями; сообщите мне, если они находятся в нужном месте. – rbhat

ответ

-1

Когда я есть дисплей замораживания, я использовать эти расширения METHODE управления:

public static class ExtensionOfControl 
{ 
    private const int WM_SETREDRAW = 11; 
    [DllImport("user32.dll")] 
    public static extern int SendMessage(IntPtr hWnd, Int32 wMsg, bool wParam, Int32 lParmam); 

    public static void SuspendDrawing(this Control parent) 
    { 
     SendMessage(parent.Handle, WM_SETREDRAW, false, 0); 
    } 
    public static void ResumeDrawing(this Control parent) 
    { 
     SendMessage(parent.Handle, WM_SETREDRAW, true, 0); 
     parent.Refresh(); 
    } 

    public static void RunWithDrawingSuspended(this Control ctrl, Action code) 
    { 
     ctrl.SuspendDrawing(); 
     try 
     { 
      code(); 
     } 
     catch (Exception) 
     { 
      throw; 
     } 
     finally 
     { 
      ctrl.ResumeDrawing(); 
     } 
    } 
} 

После попробовать это:

  this.RunWithDrawingSuspended(() => 
     { 
      tableLayoutPanel1.Controls.Clear(); 
      tableLayoutPanel1.ColumnStyles.Clear(); 

      foreach (DataRow r in DT.Rows) 
      { 

       UcColor button = new UcColor(r); 
       tableLayoutPanel1.Controls.Add(button);//, colNumNew, rowNum); 
      } 
      this.Controls.Add(tableLayoutPanel1); 
     }); 

Может быть, вы можете заменить «это» ваш TableLayoutPanel, если уже существует on "this"

+0

Если вы собираетесь [взять код у кого-то еще] (http://stackoverflow.com/questions/487661/how-do-i-suspend-painting-for-a-control-and-its-children), вы должны дать им кредит за это. –

+0

Извините, коди серый ... в то время, когда я хотел, я не думал замечать ссылки найденного кода. но метод расширения - это моя идея;) хотя другие, возможно, также подумают – lolo

Смежные вопросы