2010-11-29 11 views
1

ビルド済みのWindows.Forms PropertyGridを使用してすばやい管理インターフェイスを構築しようとしています。私は適切な属性(ExpandableObjectConverterなど)で自分のデータクラスを装飾することができ、すべてうまくいくようです。プロパティグリッドはプロパティの新しいインスタンスを作成します。

複雑なプロパティに値を設定すると、展開ボタンが表示され、コンテンツを編集できるようになりますが、null値が設定されていると、作成する方法がないようです目的のタイプの新しいインスタンス。 これに対する解決策は大きな助けになるでしょう。可能な派生値のリストから作成できるタイプをユーザーにドロップダウン表示する方法を誰かが知っている場合、ボーナスを追加しました。

+0

ヒットはそれは多くの時間を取ることにつながり、その後計画されています.... –

答えて

2

これは、ここでこの種のものはないのサンプルコードで、それほど複雑ではありません:PropertyGridのは、多くの場合、単純なUIを起動して実行を取得する簡単な方法のように見えます、そしてあなたは、このような問題を

public class MyEditor : UITypeEditor 
{ 
    private IWindowsFormsEditorService _editorService; 

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) 
    { 
     return UITypeEditorEditStyle.DropDown; 
    } 

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) 
    { 
     if (value != null) // already initialized 
      return base.EditValue(context, provider, value); 

     _editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService)); 
     ListBox lb = new ListBox(); 
     lb.SelectionMode = SelectionMode.One; 
     lb.SelectedValueChanged += OnListBoxSelectedValueChanged; 

     // TODO: add your items/logic here 
     lb.Items.Add(typeof(TYPE1)); 
     lb.Items.Add(typeof(TYPE2)); 
     .... 
     lb.Items.Add(typeof(TYPEX)); 

     _editorService.DropDownControl(lb); 
     if (lb.SelectedItem == null) 
      return base.EditValue(context, provider, value); // no selection, no change 

     // instantiate an object (add constructor logic if neede) 
     return Activator.CreateInstance((Type)lb.SelectedItem); 
    } 

    private void OnListBoxSelectedValueChanged(object sender, EventArgs e) 
    { 
     _editorService.CloseDropDown(); 
    } 
} 
+0

+1と思われます。私は試してみるよ –

0

UITypeEditorを作成する必要があります。

+0

私はそれをやるより簡単な方法がないかと思います。私が必要とするのは、新しいインスタンスを作成できるExpandableOjectConverterです。これのためにスクラッチからUIを構築するには、過剰な –

関連する問題