我正在开发一个我设计了自定义控件的项目,我正在尝试将其添加到组框中并将其定位。
初始化和将控件添加到框中的步骤正常,但是我尝试移动或调整控件大小的任何操作都会导致异常。
//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
答案 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对象但是错误被抑制了。这是一个错误还是一个功能?