Есть ли способ использовать CollectionEditor за пределами сетки свойств? - PullRequest
2 голосов
/ 28 сентября 2010

Я заменяю свою сетку свойств чем-то, что позволит мне немного лучше настроить пользовательский интерфейс.Я поместил в форму кнопку, которая, я надеюсь, при щелчке откроет CollectionEditor и позволит мне изменить мой код.Когда я использовал PropertyGrid, все, что мне нужно было сделать, это добавить некоторые атрибуты в свойство, указывающее на мой CollectionEditor, и это сработало.Но как мне вызвать CollectionEditor вручную?Спасибо!

Ответы [ 2 ]

10 голосов
/ 29 сентября 2010

Нашел ответ здесь: http://www.devnewsgroups.net/windowsforms/t11948-collectioneditor.aspx

На всякий случай, если сайт, указанный выше, когда-нибудь исчезнет, ​​вот суть. Кодекс дословно по ссылке выше, однако; комментарии мои.

Предположим, у вас есть форма с ListBox и кнопкой. Если вы хотите редактировать элементы в ListBox с помощью CollectionEditor, вы должны сделать следующее в EventHandler:

private void button1_Click(object sender, System.EventArgs e)
{
    //listBox1 is the object containing the collection.  Remember, if the collection
    //belongs to the class you're editing, you can use this
    //Items is the name of the property that is the collection you wish to edit.
    PropertyDescriptor pd = TypeDescriptor.GetProperties(listBox1)["Items"];
    UITypeEditor editor = (UITypeEditor)pd.GetEditor(typeof(UITypeEditor));
    RuntimeServiceProvider serviceProvider = new RuntimeServiceProvider();
    editor.EditValue(serviceProvider, serviceProvider, listBox1.Items);
}

Теперь следующее, что вам нужно сделать, это создать RuntimeServiceProvider (). Вот код, который был написан в приведенной выше ссылке для реализации этого:

public class RuntimeServiceProvider : IServiceProvider, ITypeDescriptorContext
{
    #region IServiceProvider Members

    object IServiceProvider.GetService(Type serviceType)
    {
        if (serviceType == typeof(IWindowsFormsEditorService))
        {
            return new WindowsFormsEditorService();
        }

        return null;
    }

    class WindowsFormsEditorService : IWindowsFormsEditorService
    {
        #region IWindowsFormsEditorService Members

        public void DropDownControl(Control control)
        {
        }

        public void CloseDropDown()
        {
        }

        public System.Windows.Forms.DialogResult ShowDialog(Form dialog)
        {
            return dialog.ShowDialog();
        }

        #endregion
    }

    #endregion

    #region ITypeDescriptorContext Members

    public void OnComponentChanged()
    {
    }

    public IContainer Container
    {
        get { return null; }
    }

    public bool OnComponentChanging()
    {
        return true; // true to keep changes, otherwise false
    }

    public object Instance
    {
        get { return null; }
    }

    public PropertyDescriptor PropertyDescriptor
    {
        get { return null; }
    }

    #endregion
}
1 голос
/ 05 октября 2017

Поскольку я не могу комментировать, я опубликую это здесь:

Вы можете получить DialogResult, добавив событие Click в okButton CollectionEditor в WindowsFormsEditorService.ShowDialog

public System.Windows.Forms.DialogResult ShowDialog(Form dialog)
{
    ((System.Windows.Forms.Button)dialog.Controls.Find("okButton", true)[0]).Click += WindowsFormsEditorService_Click;
    return dialog.ShowDialog();
}

...

private void WindowsFormsEditorService_Click(object sender, EventArgs e)
{
    dr = DialogResult.OK;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...