【问题标题】:Any way to optimize populating tableLayoutPanel?有什么方法可以优化填充 tableLayoutPanel?
【发布时间】:2016-06-30 13:09:09
【问题描述】:

我有一个tableLayoutPanel,用于 Windows 窗体。该控件由包含 sql server 数据的datatable 填充。我已经确认select 声明不是问题。

数据表经常更新,所以tableLayoutPanel也经常更新。它基本上运行良好,但它变得有点慢,闪烁更明显。

每次我需要刷新控件时,都会执行这段代码:

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 行,所以我在 Form 构造函数中只执行了一次以下代码,但我没有看到太多好处:

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

我还能如何优化填充tableLayoutPanel

谢谢。

【问题讨论】:

  • 显而易见的问题:为什么“刷新”实际上是“从头开始构建”?只改变需要改变的地方。
  • 如果没有MCVE,很难说问题出在哪里。只是一些提示:1- 在向面板添加新控件之前,首先要Dispose 之前添加的控件。目前您只删除它们。您应该同时执行删除和处置。 2- 在删除控件之前调用 panel.SuspendLayout(); 并在添加新控件之后调用 panel.ResumeLayout(true); 可能会有所帮助。
  • @RezaAghaei,我应该在哪里添加tableLayoutPanel1.Dispose();?如果我在开头添加它,我会得到运行时错误Cannot access disposed object。我已经根据您的建议修改了示例代码;如果他们在正确的地方,请告诉我。
  • @rbhatup 请不要编辑问题。目前编辑的代码将不起作用。最好回滚您的编辑。
  • 使用 TLP 实现您自己的网格控制绝不是一个错误。使用 ListView 或 DataGridView 或去购物。

标签: c# winforms visual-studio-2010 tablelayoutpanel flowlayoutpanel


【解决方案1】:

当我有一些显示冻结时,我使用那些扩展控制方法:

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);
        });

如果“this”上已经存在,也许您可​​以用您的 tablelayoutpanel 替换“this”

【讨论】:

  • 如果你要去take code from somebody else,你需要给他们信用。
  • sorry cody gray... 在我想要的时候,我没想到要注意找到的代码的引用。但是扩展方法是我的想法;)虽然其他可能也会想到
猜你喜欢
  • 2011-01-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多