.NET ROOM.NET ROOMトップへCOMRADE総合トップへ
「5:コントロールの設定値を永続化する」へ

ネストされたプロパティの永続化

 ネストされたプロパティに関しては、前述のコレクションの保存と同様に、
コードの自動生成のパターンとして以下の2つがあります。

■@外側のプロパティごと保存される■
生成例:
this.npsControl1.ParentPersist =
 ((NestedPropertiesSample.NestedPropertyClass)
  (resources.GetObject("npsControl1.ParentPersist")));


■A外側のプロパティ経由で、内側のプロパティの値が保存される■
生成例:
this.npsControl1.ChildPersist.Data = 2;


 これを切り替えるには、コレクションの保存と同様、
DesignerSerializationVisibilityAttributeを使用します。
デフォルトではDesignerSerializationVisibilityAttributeが
「DesignerSerializationVisibility.Visible」になっていますが、
これを「DesignerSerializationVisibility.Content」に設定します。

 上記の2つの違いは、DesignerSerializationVisibility.Visibleは
「親プロパティがインスタンスごと保存される」、
DesignerSerializationVisibility.Contentは「親プロパティのインスタンスの、
変更されたプロパティだけが保存される」という点です。

 DesignerSerializationVisibility.Visibleの場合は「対象としている親プロパティが必ず設定可能」に
なっている必要がありますが、DesignerSerializationVisibility.Contentの場合は
「設定したい子プロパティが設定可能」になっていれば問題ありません。
これはいくつかの類似プロパティをクラスにまとめる、といった用途に使えるでしょう。
このサンプルは、付録のNestedPropertiesSampleディレクトリに収録されています。


ページトップへ


プロパティ値を保存したくない場合

 上記のいずれかの実装を行なうと、プロパティは必ず保存されます。
反対に、プロパティの値を保存したくない場合に関しては、以下に説明する方法をとる必要があります。

単純なValue型の値を保存しない


 デザイン時には設定させたくないプロパティの場合は、BrowsableAttributeを「False」に設定します。

 これに対し、“デザイン時にプロパティを設定できるが、実際の値はほかのプロパティが保持している”など、
VS.NETの標準の仕組みで永続化したくない場合は、
DesignerSerializationVisibilityAttributeを「DesignerSerializationVisibility.Hidden」に設定します。

単純なValue型の値がDefault値の場合は保存しない


 DefaultValueAttributeをDefaultの値に設定します。
ただし、これだけでは不十分で、コントロールのコンストラクタなどで、
デフォルト値を目的のプロパティに代入しておく必要があります。
なお、DefaultValueが設定されているプロパティでは、プロパティを右クリックすると、
図2のように、リセットすることが可能になります。

図2:DefaultValueがあるプロパティのリセット



 この場合、以下のようなコードが生成されます。

   this.nppsControl1.Location = new System.Drawing.Point(48, 40);
   this.nppsControl1.Name = "nppsControl1";
   this.nppsControl1.NormalProperty = 0;
   this.nppsControl1.PropertyNotSeenAtDesignTime = 0;
   this.nppsControl1.Size = new System.Drawing.Size(144, 112);
   this.nppsControl1.TabIndex = 0;
   this.nppsControl1.Text = "nppsControl1";

 PropertyNotSeenAtDesignTimeは、図2のように、プロパティウィンドウには表示されていませんが、
値は保存されています。
場合によっては、ほかのAttributeと組み合わせる必要があるかもしれません。

 このサンプルは、付録のNonPersistedPropertiesSampleディレクトリに収録しています。


ページトップへ


ソースコードの自動生成に関する注意点

 最後にソースコードの自動生成に関して、注意点をあげておきます。


注意点1: InitializeComponentメソッドには、VS.NETが文字通り自動的に値を代入してくるので、
直接変更を加えても、デザイン画面でコントロールの設定を変更すると
消えてしまうことがあるので注意が必要です。
大きな変更点などがある場合には、ソースコードのバックアップを
取っておいたほうが安全です。

注意点2: クラスの内部データ(internalやprivateなメンバ変数の値など)を
保存しておく必要のあるクラスは、リソースに保存する必要があります。

注意点3: デザイン画面でプロパティの設定値を変更してもソースが自動生成されていない場合、
設定が永続化されていない可能性があります。
その場合は、次回同じプロジェクトを開いても設定が初期値に戻ってしまいます。
値がきちんと保存されているかどうか確認したほうがよいでしょう。


 VS.NETのソースコードの自動生成をうまく利用することで、前回説明した、
「コントロールがSerializableになっていない」というデメリットのほとんどを克服できます。
冒頭でも説明したように、通常のコントロールは、ソースコードの自動生成を利用して
変更を保存するようになっているため、自作のコントロールにも同様の仕組みを実装したほうが
より使い勝手のよいコントロールを作成することができると思います。


前へ | ページトップへ | 次へ