Конструкторы пользовательских элементов управления - PullRequest
1 голос
/ 23 мая 2011

Простите за эту длинную историю, но я думаю, что вопрос заслуживает этого.

У меня есть пользовательский элемент управления, который имеет собственный переопределенный метод 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, и фоны всех панелей внутри моего элемента управления были такими красными X, которые Winforms показывает, когда они не могут найти изображение или что-то. Однако помните, что первый экземпляр создаваемого элемента управления работал отлично.

Таким образом, я установил, что моя Visual Studio прерывается при возникновении каких-либо исключений, а не просто регистрирует ее, и она разрывается на строке внутри моего переопределенного OnPaintBackground, которая выглядела так:

e.Graphics.DrawLine(bPen, x, y, Width, Height);

С информацией Argument cannot be null. Поэтому я заглянул в окно отладчика и обнаружил, что не только bPen null, но и все мои кисти и ручки и все было null, даже если вызывался конструктор (проверяется с помощью MessageBox)!

В конце концов я решил проблему, удалив параметр из конструктора по умолчанию и добавив еще один отдельный конструктор, который принял аргумент, и вызвал ctor по умолчанию из этого. Тем не менее, я хотел бы знать, что C # имеет против элементов управления, не имеющих конструктор по умолчанию, который делает их неспособными создавать такие вещи, как Pen s?

Ответы [ 2 ]

2 голосов
/ 23 мая 2011

На этот вопрос есть несколько полезных ответов: Конструктор 'UserControl' с параметрами в C #

1 голос
/ 23 мая 2011

C # не имеет ничего против элементов управления, это не волнует.Это просто язык.Обычно вам нужен конструктор по умолчанию, потому что дизайнер полагается на них.На самом деле, что-то вроде этого у меня прекрасно работает:

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

    public MyControl(Control parent) : this()
    {
        _parent = parent;
    }
}
...