DOBON.NET DOBON.NETプログラミング掲示板過去ログ

InitializeComponentについて

環境/言語:[環境(WindowsXP)、使用言語(VB.net)]
分類:[.NET]

お世話になります。

FormやUserControlなどでコンポーネントの初期化を行うInitializeComponentについての質問です。

ユーザーコントロールを作成し(以下、UC01とします)、BackColorを赤に設定しました。
このUC01のInitializeComponentには
Me.BackColor = System.Drawing.Color.Red
という設定情報が記述されます。

次にUC01を継承したユーザーコントロールを作成ます(以下、UC02とします)。
すると、UC02のInitializeComponentには
Me.BackColor = System.Drawing.Color.Red
という設定情報は記述されていません。
UC01ではBackColorは変更された値として扱われていますが、UC02では初期値として扱われているようです。
これは継承の特性の一つである、カプセル化が行われている為だと思います。

ここで、UC02を新しくフォーム(以下、Form1とします)に貼り付けました。(貼り付けたUC02をUC021とします。)
すると、Form1のInitializeComponentには
Me.UC021.BackColor = System.Drawing.Color.Red
と記述されています。

これはどういう事でしょうか?

UC02ではカプセル化され、初期値として扱われていたBackColorプロパティがForm1に貼り付けると、
変更された値としてInitializeComponentに記述されているわけです。

Form1のInitializeComponentに記述されてしまうと、UC01のBackColorを青に変えた場合でもForm1のInitializeComponentには
Me.BackColor = System.Drawing.Color.Red
という情報が残ります。

UC01のBackColorが変更されると、Form1でUC021のBackColorプロパティを変更していない限り、変更が反映されてほしいものです。

なぜこのようになるのか?
また、貼り付けた場合にInitializeComponentに記述されるのを防ぐ為にはどうしたらいいのか?
ご存知の方がいらっしゃいましたら御教授願えないでしょうか?

以上、宜しくお願いいたします。
■No8097に返信(JUNJUNさんの記事)
> このUC01のInitializeComponentには
> Me.BackColor = System.Drawing.Color.Red
> という設定情報が記述されます。
UserControlのBackColor の DefaultValue ではないので付きますね。

> すると、UC02のInitializeComponentには
> Me.BackColor = System.Drawing.Color.Red
> という設定情報は記述されていません。
UC01で設定されているのでここでは付きません。

> ここで、UC02を新しくフォーム(以下、Form1とします)に貼り付けました。(貼り付けたUC02をUC021とします。)
> すると、Form1のInitializeComponentには
> Me.UC021.BackColor = System.Drawing.Color.Red
> と記述されています。
UC01とUC02の BackColor の DefaultValue ではないので付きますね。

> これはどういう事でしょうか?
DefaultValueAttribute クラスのヘルプを参照して考えてください。

> Form1のInitializeComponentに記述されてしまうと、UC01のBackColorを青に変えた場合でもForm1のInitializeComponentには
> Me.BackColor = System.Drawing.Color.Red
> という情報が残ります。
一度 DefaultValue ではない値で貼り付けたら引き続きそうなります。

> UC01のBackColorが変更されると、Form1でUC021のBackColorプロパティを変更していない限り、変更が反映されてほしいものです。
> なぜこのようになるのか?
> また、貼り付けた場合にInitializeComponentに記述されるのを防ぐ為にはどうしたらいいのか?
> ご存知の方がいらっしゃいましたら御教授願えないでしょうか?
UC01 に以下のような感じで DefaultValueAttribute を付けたらどうですか?

[DefaultValue(typeof(Color), "Red")]
public override System.Drawing.Color BackColor
{
 get
 {
  return base.BackColor ;
 }
 set
 {
  base.BackColor = value ;
  Invalidate();
 }
}

DOBON.NET | プログラミング道 | プログラミング掲示板