所以我根据数据网格视图中的数据创建标签。当我清除面板然后重绘(这会导致用户对象泄漏并最终导致我的应用程序崩溃)时,它工作正常。
但是我无法找到一种方法来刷新没有panel.clear的值?我尝试刷新/无效/更新/删除等所有内容,但没有任何作用。这是我打电话的方法:
panel1.Controls.Clear();
panel2.Controls.Clear();
panel1.Refresh();
panel2.Refresh();
progressLabels = new List<Label>();
progressBar = new List<ProgressBar>();
Label newLabel = new Label();
Label lblLastName = new Label();
ProgressBar progBar = new ProgressBar();
newLabel.Text = firstNameVal.ToString();
newLabel.Location = new Point(50, (i * 65));
newLabel.Font = font;
lblLastName.Text = lastNameVal.ToString();
lblLastName.Location = new Point(newLabel.Width + 80, (newLabel.Top));
lblLastName.Font = font;
panel1.Controls.Remove(newLabel);
panel1.Refresh();
panel1.Controls.Add(lblLastName);
panel1.Controls.Add(newLabel);
panel1.Controls.Add(progBar);
循环迭代数据网格视图并填充标签
for (i = 0; i < (dataGridView1.Rows.Count - 1); i++)
{
if (dataGridView1.Rows[i].Cells[1].Value
!= null)
{
if (dataGridView1.Rows[i].
Cells[0].Value.ToString().Length != 0 && dataGridView1.Rows[i].
Cells[1].Value.ToString().Length != 0)
{
firstNameVal = dataGridView1.Rows[i].Cells[0].Value.ToString();
lastNameVal = dataGridView1.Rows[i].Cells[1].Value.ToString();
percent = dataGridView1.Rows[i].Cells[2].Value.ToString();
}
}
除了用户对象泄漏之外,一切正常。有没有办法可以完全清除对象而不是panel.clear或者什么?
由于
答案 0 :(得分:0)
根据Control.ControlCollection.Clear Method的MSDN文档,我引用:
调用Clear方法不会从内存中删除控制句柄。 您必须显式调用Dispose方法以避免内存泄漏。
为什么不进行Dispose通话? 像这样:
for (int i = panel1.Controls.Count - 1; i >= 0; --i)
panel1.Controls[i].Dispose();
另外在建议说明中,为什么不能重复使用标签创建和更改其属性?我的意思是,如果您的控件在面板中保持不变,只需创建一个更新方法,该控件将在面板中循环控件,获取标签并更新属性,而不是再次重新创建它们。
使用Memprofiler,您至少可以指出在添加控件时是否存在泄漏。如果您的控件范围从1到50,通常它不会泄漏很多。另外,如果您想避免在UI中添加/删除或更新记录,为什么不使用DataGridView来显示记录?我个人认为,我已经使用DataGridView进行了许多数据展示行为。 (如果您希望有大量有关datagridview的教程,您可以看到CodeProject article)