拡張コントロールを作成していると、配置時のみ値を初期化したいことがある。
このような場合は、コンストラクタ(Newメソッド)ではなく、InitLayoutメソッドに処理を記述する。

コンストラクタに処理を記述しない理由は以下の通りである。
 ・初期化処理が2回実行されてしまう。
  →初期化処理のタイミングは、以下の通り。
    1.コントロールの配置時
    2.プログラム実行時
    (フォームの生成時等、コントロールが生成されるタイミング)
 ・Addメソッドを利用したプロパティの場合、初期値が二重登録されてしまう。
  →コンボボックスのItemプロパティやツリービューのTreeNodeプロパティ等
   ※単純な変数の初期化であれば、問題は発生しない。
値が二重登録されてしまうのは、以下のような理由がある。
 1.コントロール配置時にコンストラクタで設定した値は、以下に登録される。
  ・フォームのInitializeComponent()メソッド
   →Windowsフォームデザイナによって生成されたコード
 2.InitializeComponent()メソッドに登録される内容は、以下の通り。
  1)コントロールのインスタンス化
  2)各種プロパティの設定
   →プロパティの設定処理のみ登録される。
    (Clearメソッド等の初期化処理は登録されない)

上記を踏まえ、プログラム実行時の動作を確認する。
 1.InitializeComponent()メソッドで実行されるコントロールのインスタンス化
  →値の初期化処理が実行される。
 2.各種プロパティの設定で実行されるプロパティの初期化処理
  →配置時に実行されたコンストラクタで実行された初期化処理の内容が登録される。
 →1と2で初期化処理が行われるため、二重登録となってしまう。

InitLayoutに処理を記述すると、実行時にコントロールのインスタンス化で初期化処理が行われることはない。
そのため、二重登録になる心配はない。
但し、プロパティ値の変更を禁止する等の対処が必要になるので、注意が必要。

以下、InitLayout()メソッドのサンプル。

 Protected Overrides Sub InitLayout()
  MyBase.InitLayout()
  'ここに初期化処理を記述する
 End Sub

【補足事項】
・InitLayoutは、フォームのOverridesメソッドである。