Property Grid在属性上创建新实例

时间:2010-11-29 15:12:49

标签: .net winforms propertygrid

我正在尝试使用内置的Windows.Forms PropertyGrid构建一个快速管理界面。我设法用适当的属性(ExpandableObjectConverter等)装饰我的数据类,所有似乎都工作正常。

有一个用例我不知道:当我在复杂属性上设置值时,会出现展开按钮,我可以编辑内容但是当我有一个空值时,似乎没有办法创建一个新的所需类型的实例。  所以解决这个问题会有很大帮助。如果有人知道如何向用户显示可以从可能的派生值列表中创建的类型的下拉列表,则会添加奖励。

2 个答案:

答案 0 :(得分:2)

这不是那么复杂,这是一个做这种事情的示例代码:

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();
    }
}

答案 1 :(得分:0)

您需要创建UITypeEditor