![]() ![]() ![]() |
![]() |
||
![]() |
||
ネストされたプロパティに関しては、前述のコレクションの保存と同様に、 コードの自動生成のパターンとして以下の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ディレクトリに収録されています。 |
||
ページトップへ![]() |
![]() |
||
上記のいずれかの実装を行なうと、プロパティは必ず保存されます。 反対に、プロパティの値を保存したくない場合に関しては、以下に説明する方法をとる必要があります。 |
||
![]() |
||
デザイン時には設定させたくないプロパティの場合は、BrowsableAttributeを「False」に設定します。 これに対し、“デザイン時にプロパティを設定できるが、実際の値はほかのプロパティが保持している”など、 VS.NETの標準の仕組みで永続化したくない場合は、 DesignerSerializationVisibilityAttributeを「DesignerSerializationVisibility.Hidden」に設定します。 |
||
![]() |
||
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ディレクトリに収録しています。 |
||
ページトップへ![]() |
![]() |
|||||||
最後にソースコードの自動生成に関して、注意点をあげておきます。
VS.NETのソースコードの自動生成をうまく利用することで、前回説明した、 「コントロールがSerializableになっていない」というデメリットのほとんどを克服できます。 冒頭でも説明したように、通常のコントロールは、ソースコードの自動生成を利用して 変更を保存するようになっているため、自作のコントロールにも同様の仕組みを実装したほうが より使い勝手のよいコントロールを作成することができると思います。 |
|||||||
前へ | ページトップへ | 次へ![]() |