请原谅我这个长篇故事,但我认为这个问题很有道理。
我有一个自定义控件,它有自己的重写OnPaintBackground
方法,它使用了成员Brush
和Pen
。我是这样创造的:
CustomControl c = new CustomControl();
c.Parent = someParent;
并且构造函数只是默认构造函数,其中添加了一些用于创建画笔和笔以及背景材料的东西。
但是,我认为使用父面板的构造函数更好(因为我的控件不能在没有父元素的情况下使用)所以我在构造函数中添加了一个参数:
public CustomControl(Control parent) {
InitializeComponent();
Parent = parent;
// do a bunch of stuff like getting brushes, pens, etc for drawing the background
}
然后当我运行我的程序时,第一个控件被创建并绘制得很好。然后对于第一个之后的所有控件,我在System.Drawing.dll
获得了第一次机会异常,并且我的控件内所有面板的背景是Winforms显示的红色X
当它找不到图像或什么的时候。请记住,要创建的控件的第一个实例工作正常。
因此,当我抛出任何异常时,我将Visual Studio设置为中断,而不是仅仅记录它,并且它在我的覆盖OnPaintBackground
内的一行上出现了如下所示:
e.Graphics.DrawLine(bPen, x, y, Width, Height);
使用信息Argument cannot be null
。所以我查看调试器窗口,发现不仅bPen
为null,而且我的所有画笔和笔都是null,即使构造函数被调用(使用MessageBox验证)!
我最终通过从默认构造函数中删除参数并添加另一个接受参数的单独构造函数并从该调用中调用默认ctor来解决该问题。但是,我想知道,C#对没有默认构造函数的控件有什么作用,使得它们无法创建像Pen
这样的东西?
答案 0 :(得分:2)
这个问题有一些有用的答案:'UserControl' constructor with parameters in C#
答案 1 :(得分:1)
C#没有任何反对控件,它并不关心。这只是一种语言。通常你会想要一个默认的构造函数,因为设计师依赖它们。事实上,这样的事情对我来说很合适:
public class MyControl : Control
{
private Control _parent;
public MyControl()
{
InitializeComponent();
}
public MyControl(Control parent) : this()
{
_parent = parent;
}
}