动态生成控件,耗费资源,如何解决?

sharda 2010-08-21 09:16:42
动态创建button时,当跑起来后,只要有窗体挡在FORM上,移开后,发现系统页面重绘时,就会明显感觉到重新刷新的感觉,
看了一下进程。就在那个瞬间CPU跑到了100%,资源耗费很大,请问如何解决,以下是代码。另外,要是把这些button加在一个panel上,问题更严重,又该如何解决?
 /// 动态创建button
/// </summary>
// bool b = false;
private void CreateButton()
{

// b = true;
// this.Controls.Clear();
//Variety var = new Variety();
// var.StrNO = "111111";
// DataTable dt = VarietyDAL.GetDataTable(var);
int x = 35;
int y = 25;
for (int i = 0; i < 100; i++)
{
Button btn = new Button();

btn.Size = new System.Drawing.Size(75, 69);

btn.Name = i.ToString();
btn.Text = i.ToString();
//动态创建X,Y坐标,满屏时跳下一行
btn.Location = new System.Drawing.Point(x, y);
if (x > 1024)
{
x = 35;
y += 75;
btn.Location = new System.Drawing.Point(x, y);

}
x += btn.Width + 35;



this.Controls.Add(btn);

}



}
...全文
137 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharda 2010-08-24
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 lhblxm 的回复:]
100多个不是问题,本人试过

1\定义一个Panel数组,PANEL的尺寸设置成需要的大小,数组在大小同数据库的字段数量
2\在每个Pnael上创建控件,比如 先是LABEL ,再是TEXTBOX 或COMBOBOX之类可输入控件,然后是BUTTON等
3\在FlowLayoutPanel上添加PANEL数控件
4\运行时绑定数据

我的据库中有一个表有60多个字段,运行时整整一屏……
[/Quote]
你在这些panel上有加背景图吗?我不加图时是没问题,挺快。但有图时就会出现重绘现象
ZengHD 2010-08-21
  • 打赏
  • 举报
回复


public Form1()
{
InitializeComponent();
this.DoubleBuffered = true;
}
sharda 2010-08-21
  • 打赏
  • 举报
回复
是还是和原来一样,有窗体挡上面,移开时会很明显的重绘效果。
我的事件只有
public Form1()
{
InitializeComponent();
CreateButton();
}中使用
sharda 2010-08-21
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 zenghd 的回复:]
C# code

/// 动态创建button
/// </summary>
// bool b = false;
private void CreateButton()
{

// b = true;
// this.Controls.Clear()……
[/Quote]还是会刷
ZengHD 2010-08-21
  • 打赏
  • 举报
回复

/// 动态创建button
/// </summary>
// bool b = false;
private void CreateButton()
{

// b = true;
// this.Controls.Clear();
//Variety var = new Variety();
// var.StrNO = "111111";
// DataTable dt = VarietyDAL.GetDataTable(var);
int x = 35;
int y = 25;

this.SuspendLayout();
Button[] buttons = new Button[100];
for (int i = 0; i < 100; i++)
{
buttons[i] = new Button();

buttons[i].Size = new System.Drawing.Size(75, 69);

buttons[i].Name = i.ToString();
buttons[i].Text = i.ToString();
//动态创建X,Y坐标,满屏时跳下一行
buttons[i].Location = new System.Drawing.Point(x, y);
if (x > 1024)
{
x = 35;
y += 75;
buttons[i].Location = new System.Drawing.Point(x, y);

}
x += buttons[i].Width + 35;

}

this.Controls.AddRange(buttons);
this.ResumeLayout();
}
dancingbit 2010-08-21
  • 打赏
  • 举报
回复
如果这个方法只是调用一次的话,再消耗资源也只是创建的那一次。
如果每次窗体刷新的时候都出现这种情形的话,可能就是其他地方的代码问题。
sharda 2010-08-21
  • 打赏
  • 举报
回复
主要是要实现动态创建的功能,因为到时是从数据库里取值来生成的。
wuyq11 2010-08-21
  • 打赏
  • 举报
回复
减少动态创建,用户控件
zlcp520 2010-08-21
  • 打赏
  • 举报
回复
UBB 内容存入剪贴板
sharda 2010-08-21
  • 打赏
  • 举报
回复
是winform的,不是web的。
whb147 2010-08-21
  • 打赏
  • 举报
回复
还不如构造html呢
lhblxm 2010-08-21
  • 打赏
  • 举报
回复
100多个不是问题,本人试过

1\定义一个Panel数组,PANEL的尺寸设置成需要的大小,数组在大小同数据库的字段数量
2\在每个Pnael上创建控件,比如 先是LABEL ,再是TEXTBOX 或COMBOBOX之类可输入控件,然后是BUTTON等
3\在FlowLayoutPanel上添加PANEL数控件
4\运行时绑定数据

我的据库中有一个表有60多个字段,运行时整整一屏,加上导航工具条也是动态生成的,窗体也是动态生成的
,只是在初始化时CPU使用率高一点,其它切换窗体没有出现楼主所说的现象,是不是楼主在其它代码中重新初始化了
mjp1234airen4385 2010-08-21
  • 打赏
  • 举报
回复
没有什么好办法了。
100多个控件放在一个界面上,当然是会慢了。
试试别的办法吧。
例如:绘图把你要的数据绘制到窗体上去,并且用list记下位置和大小,
当鼠标在那个区域时,执行相应的代码。
sharda 2010-08-21
  • 打赏
  • 举报
回复
this.DoubleBuffered = true;
已经设置过了

110,537

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧