C# - 更改GroupBox中自定义控件的位置(返回null引用异常)

时间:2016-05-21 10:57:42

标签: c# location nullreferenceexception groupbox

我正在开发一个我设计了自定义控件的项目,我正在尝试将其添加到组框中并将其定位。

初始化和将控件添加到框中的步骤正常,但是我尝试移动或调整控件大小的任何操作都会导致异常。

        //initialise using object in outputs collection
        VitalsVisual vitalsVisual = vitalOutputs.getVitalsVisual();
        //add to relevant groupbox
        grpbxIntraOp.Controls.Add(vitalsVisual);
        //change location (coordinates within groupbox)
        vitalsVisual.Location = new Point(249, 256); //THROWS EXCEPTION
        //resize
        vitalsVisual.Size = new Size(494, 342); //THROWS EXCEPTION IF REACHED

我所得到的所有指示行都是"对象引用未设置为对象的实例"。我不太明白这一点,因为它会指向VitalsVisual vitalsVisual没有被初始化,但是构造函数被调用并且Controls.Add()命令正在工作。当然,如果它没有被初始化,这个命令将抛出相同的异常。

有人能发现这里可能出错的地方吗?真的很感激在正确的方向上轻推!

谢谢,Mark

1 个答案:

答案 0 :(得分:1)

有趣,但这是设计上的。

测试:

Button button = null;
this.Controls.Add(button);
button.Location = Point.Empty;

这也是一样的,即它会抛出最后行,而不是添加时...

因此,允许尝试null目标添加到Controls集合中。

我写了'尝试'因为Controls.Add实际上安静地失败

Button button = null;
Console.WriteLine( this.Controls.Count + " controls now.";
this.Controls.Add(button);
Console.WriteLine( "Still " + this.Controls.Count + " controls.";

计数没有变化。

查看sources确认了这一点:

  

public virtual void Add(Control value) { if (value == null) return; ...

总而言之:你的函数肯定会返回一个null对象但是错误被抑制了。这是一个错误还是一个功能?