なんとなくやってみる > 文字列型コレクションエディタの作成

1. 目次

2. 概要

StringCollection、又はList<string>のプロパティをPropertyGridコントロールから編集しようとすると、 コレクションエディタが起動される。

しかし、コレクションに項目を追加しようとすると「型 'System.String' にコンストラクタが見つかりませんでした。」とエラー表示が出てしまう。 もちろん項目も追加されない。

少々調べはしたが、簡単な解決策がわからないので、思い切ってコレクションエディタを改造しました。

メモを残さないと後々忘れそうなのでメモを残しておきます。

3. ソースコード

まず、全体のソースコードを示します。

          
                  namespace SampleNS1
                  {
                  // コレクションを含むクラス
                  public class Class1
                  {
                  // コレクション実体
                  private StringCollection _Values;
                  // プロパティ
                  [System.ComponentModel.Editor( typeof( StringCollectionEditor ), typeof( System.Drawing.Design.UITypeEditor ) )]
                  public StringCollection Values
                  {
                  get
                  {
                  return _Values;
                  }
                  }
                  }
                  // エディタ定義
                  public class StringCollectionEditor : System.ComponentModel.Design.CollectionEditor
                  {
                  // コンストラクタ
                  public StringCollectionEditor( Type type ) : base( type )
                  {
                  }
                  // 複数のコレクションの要素を一度に選択できるかどうかを示す値を取得します。
                  protected override bool CanSelectMultipleInstances()
                  {
                  return false;
                  }
                  // コレクションに格納されているデータ型を取得します。
                  protected override Type CreateCollectionItemType()
                  {
                  return typeof( string );
                  }
                  // 指定したコレクション項目の型の新しいインスタンスを作成します。
                  protected override Object CreateInstance( Type itemType )
                  {
                  if( itemType.Name == typeof( string ).Name ) {
                  return "";
                  }
                  return null;
                  }
                  // 特定のリスト項目の表示テキストを取得します。
                  protected override string GetDisplayText( Object value )
                  {
                  if( value.GetType().Name == typeof( string ).Name ) {
                  return ( string )value;
                  }
                  return value.GetType().Name;
                  }
                  }
                  }
                
        

実行した際に表示されるコレクションエディタは以下のように表示されます。

4. コレクションエディタの改造方法

コレクションエディタの改造は、System.ComponentModel.Design.CollectionEditorを継承したクラスで、必要なメソッドをオーバーライドして行います。

オーバーライドしたメソッドは、

の4つです。

また、コンストラクタの作成も忘れないでください。

各メソッドの詳細は、ソースコードのコメントから推論してください。(そんなに難しくないはず)

Copyright 2009 Makoto Okuyama
inserted by FC2 system