使用不同的父项从列表中删除控件

时间:2014-02-10 14:34:31

标签: c# winforms controls

我试图动态删除控件,而不知道父控件。 但是当我调试时,我在mscorlib.dll中不断收到“System.NullReferenceException”。

我的代码:

//Delete Controls
        List<PictureBox> toDelete = severalControlsFromDifferentPanels;
        for (int i = toDelete.Count - 1; i >= 0; --i)
        {
            Control parent = toDelete[i].Parent;
            parent.Controls.Remove(toDelete[i]);
        }

我在这里缺少什么? 我在监督明显的事吗? 提前谢谢!

2 个答案:

答案 0 :(得分:2)

在访问之前检查pictureBox是否有父级:

foreach(PictureBox pictureBox in toDelete)
    if (pictureBox.Parent != null)
        pictureBox.Parent.Controls.Remove(pictureBox);

为了使此代码更具可读性,您可以创建扩展方法:

public static void RemoveFromParent(this Control control)
{
    if (control == null)
       throw new ArgumentNullException();

    if (control.Parent == null)
        return;

    control.Parent.Controls.Remove(control);
}

因此删除控件将如下所示:

foreach(PictureBox pictureBox in toDelete)
    pictureBox.RemoveFromParent();

答案 1 :(得分:0)

东西是null;尝试访问null对象上的属性或方法将抛出该异常。

在第一行放置断点并逐步执行代码。

 List<PictureBox> toDelete = severalControlsFromDifferetPanels;

 // if severalControlsFromDifferetPanels is null, then toDelete.Count will throw
 for (int i = toDelete.Count - 1; i >= 0; --i)
 {
     // if toDelete[i] is null, then accessing .Parent will throw
     Control parent = toDelete[i].Parent;

     // if parent is null, then .Controls will throw
     parent.Controls.Remove(toDelete[i]);
 }

我们不能通过你提供的代码告诉我们。

相关问题