- PR -

ユーザーコントロールのデザイン時プロパティ(コレクション)について

1
投稿者投稿内容
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-11-01 22:26
いつも何気なくユーザーコントロールを作成し、何気なく使っているのですが
大概のプロパティは特に何も意識せずともデザイン時に編集でき
特に意識せずともシリアル化され、ソースコードに埋め込まれていきます。

VB6の時とは大違いなのです。

ところが、ユーザー定義のコレクションに関してはどうもそうではないようで
以前どうやってもうまくいかず、カスタムデザイナを作成して。。。と
四苦八苦してみても駄目でそのまま懸案になっているものがあります。

なかなか忙しくて解決しないまま(当時はこの会議室のことも知りませんでした)
普通にアプリでアイテムを作ってAddしている状況なのですが
皆様はどのようにしていますでしょうか?

もし簡単にできることだったり、私がなにかとんでもない勘違いをしていて
普通にユーザー定義のコレクションもデザイン時の定義が保管されるものなのかもと思い
投稿させていただきました。

よろしくお願いいたします。

じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2005-11-01 23:36
私は、コレクション エディタを使っています。
ICollection を実装したコレクションに AddRange なメソッドを追加しています。
これで、デザイナでの更新内容が InitializeComponent メソッドで行われるようになります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-11-02 23:01
引用:

じゃんぬねっとさんの書き込み (2005-11-01 23:36) より:
私は、コレクション エディタを使っています。
ICollection を実装したコレクションに AddRange なメソッドを追加しています。
これで、デザイナでの更新内容が InitializeComponent メソッドで行われるようになります。



えーと、まずはICollection を実装という点ですが
これはCollectionBaseから派生させれば実装済みという解釈でよろしいでしょうか?

次に「コレクション エディタ」とは.Net Frameworkで準備されたなんらかのエディタでしょうか?

たとえば、私がやってみたのは

コード:

<Editor(GetType(MyCollectionUIeditor), GetType(UITypeEditor))> _
Public Shadows Property Items() As MyCollection


こんな感じでカスタムエディタを呼び出して
EditValueをオーバーライドしてShowDialogでエディタを呼び出して
結果を書き戻すというような手順を取ったように思うのですが
(見よう見まねで作ったのでなにがなにやらいまひとつわかっていなかったりします)

正しい手順はどのようになりますでしょうか?


[ メッセージ編集済み 編集者: ジブ 編集日時 2005-11-02 23:06 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-11-04 20:13
ジブさん、こんばんは。

引用:

えーと、まずはICollection を実装という点ですが
これはCollectionBaseから派生させれば実装済みという解釈でよろしいでしょうか?


そうですね。
その辺はオブジェクトブラウザで見ると判ると思います。

引用:

次に「コレクション エディタ」とは.Net Frameworkで準備されたなんらかのエディタでしょうか?


System.ComponentModel.Design.CollectionEditor の事です。
コレクションなプロパティを公開すると、標準で適用されるヤツです。
ただ、コレクションが IList を実装してないとコレクションエディタから追加とか出来なかったような気がするんですが、これは単に私の記憶違いかも知れません。
ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2005-11-08 21:52
引用:

きくちゃんさんの書き込み (2005-11-04 20:13) より:
System.ComponentModel.Design.CollectionEditor の事です。
コレクションなプロパティを公開すると、標準で適用されるヤツです。



きくちゃんさん、ありがとうございます。

出先からで今試せなくて、ごめんなさい。

つまり、カスタムエディタを作成する際に、CollectionEditorを継承しなければならないということなんでしょうか?

カスタムエディタでも付属エディタでもデザイン時編集を可能にしてるだけだと認識していたのですが
エディタ自身がプロパティをシリアル化してどこかに埋め込む必要性があったりするのでしょうか?

以前試した時にはカスタムエディタ自身はきちんと機能して、実際にコレクションは作成され
いったんエディタを閉じて開きなおしてもコレクションはきちんと復元されたのですが
フォームを閉じてしまうと消えてしまうという状態で
つまりシリアル化されていないというか保存されないという状況でした。

自分でどこかリソースファイルにでも書き出さないといけないのかなと思ったりしていました。

単に勘違いで変なことをしているだけなのか
いまひとつ手順というか仕組みがわかりません。

どこかに参考になるような文献はないでしょうか?


[ メッセージ編集済み 編集者: ジブ 編集日時 2005-11-08 22:04 ]
きくちゃん
ぬし
会議室デビュー日: 2003/08/01
投稿数: 854
お住まい・勤務地: 都内某所
投稿日時: 2005-11-10 13:28
ジブさん、こんにちは。

引用:

つまり、カスタムエディタを作成する際に、CollectionEditorを継承しなければならないということなんでしょうか?


いや、そうではなくて、標準的なコレクションなら特にカスタムエディタを作る必要はありませんよ、というお話です。

引用:

エディタ自身がプロパティをシリアル化してどこかに埋め込む必要性があったりするのでしょうか?


独自のシリアライズコードは、カスタムシリアライザを作成して DesignerSerializer 属性で指定すれば実現できますが、コレクションメンバ クラスにカスタム型コンバータを適用する方が手っ取り早いと思います。

ジブ
大ベテラン
会議室デビュー日: 2005/09/22
投稿数: 135
投稿日時: 2006-01-12 21:08
引用:

きくちゃんさんの書き込み (2005-11-10 13:28) より:
独自のシリアライズコードは、カスタムシリアライザを作成して DesignerSerializer 属性で指定すれば実現できますが、コレクションメンバ クラスにカスタム型コンバータを適用する方が手っ取り早いと思います。



きくちゃんさん、じゃんぬねっとさん、ありがとうございました。

ずいぶんと遅くなってしまいましたが
いろいろやってみて、ようやっと状況が把握できました。
(あまりに無知で、さっぱり要領を得ない質問で申し訳ありませんでした。)

どうやらコレクション要素にカスタムクラスを持つカスタムコレクションの場合
以下のパターンになるのだろうと思っています。

1.型コンバータでInstanceDescriptorに応答してConstructorInfoを設定してやる
(この場合、カスタムクラスが複雑になるとコンストラクタをどうするかという問題がある)
2.カスタムクラスをSerializableとしてマークする
(この場合、柔軟性にかける)
3.カスタムクラスにIserializeインタフェースを実装する
(カスタムクラスがさらに子要素を持ち、複雑な場合はどうなるのかよくわかりませんでした。)

結局、バージョン互換というか、拡張性という観点から
独自のシリアライザを使ってリソースに保存、コンストラクタで復元という手法をとることにしようかと考えています。
(折衷案みたいかなと思っています)

シリアライザ・デシリアライザは別目的ですでに作ってありますので、なんとかなりそうです。

いろいろありがとうございました。

1

スキルアップ/キャリアアップ(JOB@IT)