容器控件与内存管理

龙旭尤一 2011-02-09 05:47:47
刚学C#,做一个小的软件功能很简单就是查ACCESS中的数据显示出来,用到了TabelLayoutPanel
TableLayoutPanel上若干个Panel,
每个Panel上有一个PictureBox,一个按钮,2个标签,

我写了个函数根据已经刷新的数据集重新加载TableLayoutPanel上的控件,每次添加前用 Controls.Clear()控件清除之前的控件,发现内存没刷新下数据,就升高很多。原来 Controls.Clear()只是移除控件不是释放 控件所占的内存。

后来我用这样清除TableLayoutPanel上的控件:

foreach (Control c in tableLayoutPanel1.Controls)
{
Panel panel=(Panel)c;
foreach (Control dc in panel.Controls)
{
dc.Dispose();
}

c.Dispose();
}

发现效果不大。。。。

问题1:那么怎么在重新加载数据前清除TableLayoutPanel上的子控件所占的所有内存呢。
为题2:就是我加载PictrueBox时是直接用pictrueBox.ImageLocation加载硬盘上的图片的,原图片可能很大,觉得这也是占内存的一个原因,怎么加载图片的时候就是加载的缩略图。 还有PictureBox在 dispose时是否在PictureBox中Image对象也释放了


...全文
155 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
龙旭尤一 2011-02-10
  • 打赏
  • 举报
回复
我加载控件是这样的

//用n遍历数据集循环加到tableLayoutPanel上
DataRow row = insectTable.Rows[n];//数据集中的一条记录
string insect_no = row["insect_no"].ToString();
DataRow mainPicRow = this.accessDb.getMainPicRow(insect_no);

//其中的几个字段
string insectName = row["name"].ToString();
string part = row["part"].ToString();
string picPath="";
string description = "";

PictureBox pictrueBox = new PictureBox();
pictrueBox.ImageLocation = Application.StartupPath+"\\"+ picPath;
pictrueBox.SizeMode = PictureBoxSizeMode.Zoom;
pictrueBox.Size = new Size(275, 177);
pictrueBox.Dock = DockStyle.Top;
pictrueBox.Location = new System.Drawing.Point(5, 5);
pictrueBox.Click+=new EventHandler(pictrueBox_Click);
pictrueBox.MouseMove+=new MouseEventHandler(pictrueBox_MouseMove);
toolTip1.SetToolTip(pictrueBox, description);


Label lblName = new Label();
lblName.AutoSize = true;
lblName.Font = new System.Drawing.Font("宋体", 12F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));
lblName.Location = new System.Drawing.Point(20, 191);
lblName.Name = "label1" + n;
lblName.Size = new System.Drawing.Size(56, 16);
lblName.Text = "名称:" + insectName;


Label lblPart = new Label();
lblPart.AutoSize = true;
lblPart.ForeColor = System.Drawing.Color.Blue;
lblPart.Location = new System.Drawing.Point(20, 214);
lblPart.Name = "label2" + n;
lblPart.Size = new System.Drawing.Size(41, 12);
lblPart.Text = "发病部位:" + part.Replace(",", ",");


Button button = new Button();
button.Text = "查看详细";
button.Location = new System.Drawing.Point(197, 200);
button.Size = new Size(75, 23);
button.Tag = n;
button.Click += new System.EventHandler(this.showDetail_Click);

Panel panel = new Panel();
panel.BorderStyle = BorderStyle.FixedSingle;
panel.Size = new Size(303, 260);
panel.Padding = new Padding(10, 10, 10, 10);


panel.Controls.Add(pictrueBox);
panel.Controls.Add(button);
panel.Controls.Add(lblName);
panel.Controls.Add(lblPart);
this.tableLayoutPanel1.Controls.Add(panel);
龙旭尤一 2011-02-10
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lq98710 的回复:]

需要用那部分就显示或者加载哪些啊,何必全部都弄出来?
[/Quote]
数据是没多少,一个小软件,用户要进行过滤查询的操作还有现实全部,这些都需要重新加载..
lq98710 2011-02-10
  • 打赏
  • 举报
回复
需要用那部分就显示或者加载哪些啊,何必全部都弄出来?
龙旭尤一 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wuyq11 的回复:]

内存占用多大
[/Quote]
十几兆的涨,我一直刷新的话涨到600多兆了
wuyq11 2011-02-09
  • 打赏
  • 举报
回复
内存占用多大
龙旭尤一 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 caozhy 的回复:]

GC.Collect()
[/Quote]
这个也用了,好像不好使,没效果
threenewbee 2011-02-09
  • 打赏
  • 举报
回复
GC.Collect()
龙旭尤一 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 wuyq11 的回复:]

释放
int x =this.panel1.Controls.Count - 1;
for (int i = x; i >= 0; i--)
{
if (this.panel1.Controls[i] is Button)
{
this.panel1.Controls.Remove(this.panel1.Controls[i]);
}
}

……
[/Quote]
remove的原理和clear好像是一样的,没从新加载一次内存就升好多
龙旭尤一 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 sp1234 的回复:]

这大多是编程设计问题,比如假设你在3秒钟内加载1000个小控件,然后3秒钟后就是放了,可是用户根本不看这些控件,这些数据根本不需要立刻用控件来显示。
[/Quote]
不是,每次点刷新或是重新条件查询数据集都会变,
数据是要在控件上显示的比如图片的地址,还有名称之类的。
数据变化后TableLayoutPanel上就要重新加载了
  • 打赏
  • 举报
回复
这大多是编程设计问题,比如假设你在3秒钟内加载1000个小控件,然后3秒钟后就是放了,可是用户根本不看这些控件,这些数据根本不需要立刻用控件来显示。
wuyq11 2011-02-09
  • 打赏
  • 举报
回复
foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用
wuyq11 2011-02-09
  • 打赏
  • 举报
回复
释放
int x =this.panel1.Controls.Count - 1;
for (int i = x; i >= 0; i--)
{
if (this.panel1.Controls[i] is Button)
{
this.panel1.Controls.Remove(this.panel1.Controls[i]);
}
}

  • 打赏
  • 举报
回复
内存升高多少?

有用户因为喜欢关心这个而要求你的软件退货么?如果用户只有512M内存,能不能建议这个用户花了100多块钱卖一条2G的内存条呢?
龙旭尤一 2011-02-09
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 sjzlxd 的回复:]

其实已经释放了 只不过垃圾回收器没有及时回收而已 不必在意 当必要时刻 垃圾回收自然会回收的
[/Quote]
可是内存真的很高 一会就200多M了
人工智能算法 2011-02-09
  • 打赏
  • 举报
回复
其实已经释放了 只不过垃圾回收器没有及时回收而已 不必在意 当必要时刻 垃圾回收自然会回收的
kangjay1 2011-02-09
  • 打赏
  • 举报
回复
问题2,我认为释放了
容器都释放了,里面的对象还用什么放呢??

110,526

社区成员

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

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

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