2

请原谅我讲了这么长的故事,但我认为这个问题值得。

我有一个我制作的自定义控件,它有自己的重写OnPaintBackground方法,该方法使用成员BrushPen. 我是这样创建它的:

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空的,而且我所有的画笔和钢笔以及所有东西都是空的,即使正在调用构造函数(使用 MessageBox 验证)!

我最终解决了这个问题,方法是从默认构造函数中删除参数并添加另一个带有参数的单独构造函数,并从该构造函数调用默认 ctor。但是,我想知道,对于没有默认构造函数的控件,C# 有什么让它们无法创建像Pens 这样的东西?

4

2 回答 2

3

这个问题有一些有用的答案:'UserControl' constructor with parameters in C#

于 2011-05-23T16:10:53.477 回答
2

C# 没有反对控制,它不在乎。它只是一种语言。通常你会想要一个默认的构造函数,因为设计者依赖它们。事实上,这样的事情对我来说很好:

public class MyControl : Control
{
    private Control _parent;
    public MyControl()
    {
        InitializeComponent();
    }

    public MyControl(Control parent) : this()
    {
        _parent = parent;
    }
}
于 2011-05-23T16:08:52.383 回答