この長い話で申し訳ありませんが、質問はそれに値すると思います。
私が作成したカスタム コントロールがあります。OnPaintBackground
これには、メンバーBrush
とPen
. 私は次のように作成していました:
CustomControl c = new CustomControl();
c.Parent = someParent;
コンストラクターは、ブラシとペンと背景用のものを作成するためのものが追加されたデフォルトのものでした。
ただし、親パネルを使用するコンストラクターを使用する方がよいと考えたので (親がないとコントロールを使用できないため)、コンストラクターにパラメーターを 1 つ追加しました。
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 を呼び出すことで問題を解決しました。しかし、私は知りたいのですが、コントロールが s のようなものを作成できないようにするデフォルトのコンストラクターを持たないことに対して、C# は何を持っているPen
のでしょうか?