动态创建控件但无法更新它们

时间:2014-09-23 04:40:56

标签: c# datagridview

所以我根据数据网格视图中的数据创建标签。当我清除面板然后重绘(这会导致用户对象泄漏并最终导致我的应用程序崩溃)时,它工作正常。

但是我无法找到一种方法来刷新没有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或者什么?

由于

1 个答案:

答案 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