none
UI型エディタでコレクションプロパティを編集するには RRS feed

  • 質問

  • こんにちは、さとくんパパこと古谷です。お世話になっています。

    先の問題が解決する前で申し訳ないのですが、もう一つ質問を上げさせてください。

    --------------------------------
    やろうとしている事&ここまでの経緯
    --------------------------------
    WindowsFormを使用したUI型エディタを作成してASP.NETカスタムサーバコント
    ロールのプロパティを設定させようとしています。(つまり前の質問と同じ)

    ただし設定するプロパティはList<カスタム構造体>型であるため、プロパ
    ティウィンドウには『(コレクション)』と表示されます。

    コレクション型プロパティの編集用には専用のCollectionEditorがありますが、

    ①このリストメンバーの名前が非常に長い
    ②リストメンバーの候補者は事前に決定しているので、画面上のリストボック
      から選択または解除出来るようにしたい。
     
    という2つの理由により、通常のCollectionEditorでは事足りません。

    --------------------------------
    という訳で、UI型エディターの登場となりました。作成手順は以下の通りです。

    1)UITypeEditorを継承するTestClassEditorを作成します。

    2)GetEditStyleメソッドをオーバーライドして、モーダル・ダイアログ型を指定します。

    3)EditValueメソッドをオーバーライドして内部でWindowsFormを継承した
    モーダルダイアログを表示
    し、このフォーム上のリストボックスに、設定済みの
    プロパティ値や、これから設定可能な候補者を表示させます。
    フォーム上のボタン操作により、コレクションプロパティの候補リストからの選択/解除
    が実行できるようにします。

    で・・・

    あとはEditValueをオーバーライドしてフォーム上のリストボックスで選択された
    値のリストをコレクション型に変換して戻り値にすればいいはずです。

    ちなみにこのUI型エディタで値を受けるプロパティには以下のような属性定義
    を行っています。

    [
      Category("Behavior"),
      Description("・・・プロパティの説明・・・"),
      DesignerSerializationVisibility(DesignerSerializationVisibility.Content), ←①
      PersistenceMode(PersistenceMode.InnerDefaultProperty),←②
      Editor(typeof(TestClassEditor[←UI型エディタの型名]), typeof(UITypeEditor))←③
    ]
    public List<TestClass> TestClassess
    {
      ・・・・
    この属性指定により①でList<TestClass>のシリアル化を、②でコントロー
    ルタグ内の入れ子表示を、そして③によりお手製UI型エディタの使用を実装
    します。

    また当然ですがTestClassの定義ではTypeConverter属性を以下のように指定
    しております。
    [ TypeConverter(typeof(ExpandableObjectConverter)) ]
    public class TestClass
    {
      ・・・・

    で、このカスタムコントロールをビルドして、テスト用Webフォーム上に
    配置して、プロパティグリッド上で参照ボタンをクリックすると、ちゃんと
    モーダルダイアログがが表示されるのですが・・・


    --------------------------------
    【問題点】
    --------------------------------

    残念ながらダイアログフォーム上でDialogResult.OKを返すボタンをクリックしても
    テストフォーム上のコントロールプロパティには、何らこの値は設定されません

    上の属性指定の③を通常のCollectionEditorを使用したものに変更すると、問題なく
    値が設定されるようになります。

    これはどうしてなのでしょうか?
    そもそも『UI型エディタでコレクションプロパティは設定不可能』というわけ
    ではないはずです。(MSヘルプ『ユーザーインターフェイス型エディタの概要
    内で、ちゃんと 例えば『TabControlのTabPageコレクションエディタ・・・のよう
    なコレクションエディタは、モーダルエディタです。
    』とちゃんと書いてあります!)

    --------------------------------
    【知りたい事】
    --------------------------------
    という訳で、WindowsFormを使用したUI型カスタムプロパティエディタで
    コレクションクラスの値を設定する方法を、何方かご存知の方ご教授願います。

    毎々マニアックな質問で申し訳ございません。しかしながら、このような
    マニアックな質問に答えてくれそうなフォーラムが他に見つからないため、
    どうしてもこちらを頼ってしまいます。

    どうかよろしくお願いいたします。

    2009年8月25日 17:28

回答

  • こんにちは、さとくんパパこと古谷です。お世話になっています。

    自己レスですが、なんと解決しました!
    日本語情報圏にはどこにも(ヘルプや各種書籍を含む)情報が無かったので、MSDNの英語フォーラムに投稿したところ、ちゃんとアドバイスをいただき解決しました。

    同じ事をやろうとしている方には非常に有益な情報だと思われますので、是非こちらをご参照ください。

    http://forums.asp.net/t/1464725.aspx


    もう一つの画像リソースファイルの件も、こちらに質問してみようと思います。
    2009年9月4日 13:13