C# TableLayoutPanel非常慢
我正在C#(表单)中使用C# TableLayoutPanel非常慢,c#,tablelayoutpanel,C#,Tablelayoutpanel,我正在C#(表单)中使用TableLayoutPanel。 我的桌子很大,有33列8行。所有单元格都包含标签-对象 我已经设置了DoubleBuffered=true: public class DoubleBufferedTableLayoutPanel : TableLayoutPanel { public DoubleBufferedTableLayoutPanel() { DoubleBuffered = true; } } 如果用户按下按钮X,
TableLayoutPanel
。
我的桌子很大,有33列8行。所有单元格都包含标签
-对象
我已经设置了DoubleBuffered=true通过创建新的子类创建my TableLayoutPanel的代码>:
public class DoubleBufferedTableLayoutPanel : TableLayoutPanel
{
public DoubleBufferedTableLayoutPanel()
{
DoubleBuffered = true;
}
}
如果用户按下按钮X,则删除所有单元格控件,并将其他标签加载到表中(从包含所有标签对象的数组中)
DEL:this.table.Controls.Remove(this.table.GetControlFromPosition(col,row))代码>
添加:this.table.Controls.ADD(this.labelArray[row,(col+pos)],col,row)代码>
除了删除控件和添加新控件的过程需要5到10秒外,所有操作都很正常
除了设置DoubleBuffered=true之外,还有其他方法可以加快这个过程吗?我可能错了,但这听起来像是datagridview的作业,datagridview针对这些任务进行了优化。您是否每次执行操作(回发)时都从数据库获取数据来填充tablelayoutpanel
如果是,请考虑在页面首次加载时将数据加载到可绑定对象中一次。
然后在重新绑定(回发时)时使用填充的对象。使用此代码可以避免在C中处理事件的速度慢#
试试这个代码
TableLayoutPanel.GetType().GetProperty("DoubleBuffered",
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
.SetValue(TableLayoutPanel, true, null);
您正在使用线程吗?您是否尝试过在SuspendLayout
&resumellayout
调用之间嵌入Add
/Remove
调用?@LokiSinclair在填充表格时没有。。。我如何最好地实现这一点?创建两个线程,这两个线程都填满了表的一半?@olydis没有,但会尝试正确的方法now@olydis+1现在速度更快了,但仍然有相当长的延迟(几秒钟…)没有;程序启动,面板初始化,数组创建。这个数组只填充了一次-以后任何时候都不会更改…你想解释一下为什么你投了反对票还是无缘无故地随机填充?你的回答帮助我解决了一个类似的问题…感谢我用数据填充了一个tableLayoutPanel,它非常慢…在更改为datagridView后,填充数据需要6秒钟,这是非常简单的太好了,如果你不确定,我建议你不要发布答案,或者你可以将其作为评论发布。。。没人能否决评论你能解释一下这到底是怎么回事吗?嗨,汉堡包杰克,欢迎来到StackOverflow。谢谢你的回答。如果您的答案提供更多关于OP示例中的错误以及您的答案如何修复的信息,堆栈溢出社区将受益更多,而不仅仅是“技术性”的复制和粘贴。阅读本文的人希望看到您的见解,而不仅仅是最终的代码。JimbobI认为这只是我的编码风格,使用GetProperty获取“DoubleBuffered”属性,从而修改TableLayoutPanel中的DoubleBuffered,我确信这是有用的
TableLayoutPanel.GetType().GetProperty("DoubleBuffered",
System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
.SetValue(TableLayoutPanel, true, null);