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