StringCollection、又はList<string>のプロパティをPropertyGridコントロールから編集しようとすると、 コレクションエディタが起動される。
しかし、コレクションに項目を追加しようとすると「型 'System.String' にコンストラクタが見つかりませんでした。」とエラー表示が出てしまう。 もちろん項目も追加されない。
少々調べはしたが、簡単な解決策がわからないので、思い切ってコレクションエディタを改造しました。
メモを残さないと後々忘れそうなのでメモを残しておきます。
まず、全体のソースコードを示します。
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;
}
}
}
実行した際に表示されるコレクションエディタは以下のように表示されます。
コレクションエディタの改造は、System.ComponentModel.Design.CollectionEditorを継承したクラスで、必要なメソッドをオーバーライドして行います。
オーバーライドしたメソッドは、
また、コンストラクタの作成も忘れないでください。
各メソッドの詳細は、ソースコードのコメントから推論してください。(そんなに難しくないはず)