2010-11-29 3 views
1

Я пытаюсь создать быстрый административный интерфейс, используя встроенный в Windows.Forms PropertyGrid. Мне удалось украсить классы данных соответствующими атрибутами (ExpandableObjectConverter и т. Д.), И все, кажется, работает нормально.Свойство Grid создать новый экземпляр объекта

Существует случай, который я не выясняю: когда у меня есть значения, заданные в сложных свойствах, появляется кнопка расширения, и я могу редактировать содержимое, но когда у меня есть нулевое значение, похоже, нет способа создать новый экземпляр желаемого типа. Так что решение этого было бы очень полезно. Добавлен бонус, если кто-то знает способ представления раскрывающегося списка пользователю о том, какие типы он может создать из списка возможных производных значений.

+0

PropertyGrid часто выглядит как быстрый способ получить простой пользовательский интерфейс и работает, то вы попали такие проблемы, как это что приводит к этому, занимая намного больше времени, чем планировалось .... – 2010-11-29 16:57:19

ответ

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

+1. я попробую – 2010-11-29 17:10:19

0

Вам необходимо создать UITypeEditor.

+0

, прежде чем я начну делать это, мне интересно, нет ли более простого способа сделать это. В конце концов, мне нужен ExpandableOjectConverter, который может создавать новые экземпляры. Для создания пользовательского интерфейса от скребка для этого кажется излишним – 2010-11-29 15:23:37

Смежные вопросы