Как создать пользовательскую форму редактора коллекции для использования с сеткой свойств? - PullRequest
8 голосов
/ 23 сентября 2011

Я пытаюсь включить элемент управления сеткой свойств в класс, в котором в качестве одного из свойств указан список / коллекция другого класса. Давайте назовем их классом A, и список будет содержать класс B для справки.

Я хотел включить форму с двумя списками. Поле со списком слева будет содержать список всех классов B в моей программе, которых в данный момент нет в списке справа. Список справа будет содержать все классы B, которые в настоящее время связаны с классом A. Мне нужны промежуточные кнопки для перемещения элементов между двумя списками.

Это было бы легко спроектировать, но я точно не знаю, как настроить форму, которая будет использоваться в качестве редактора коллекции.

Кто-нибудь может указать мне правильное направление?

А также, как я могу настроить раскрывающийся список для свойства, содержащего список идентификаторов, из которых можно выбрать, если кто-нибудь может указать мне направление для достижения этой цели.

Ответы [ 2 ]

17 голосов
/ 27 сентября 2011

Хорошо, я наконец смог отследить, как это сделать.

Я пытался создать пользовательский CollectionEditor.CollectionForm, который был близок к тому, что мне нужно было сделать, но это было не совсемправильное направление.

Прежде всего, создайте обычную форму Windows, которая включает ваш графический интерфейс для редактирования вашей коллекции.Затем просто включите кнопки / кнопки, которые возвращают DialogResult в форме.

Теперь ключ к достижению того, что я искал, не CollectionEditor.CollectionForm, как я думал, будет правильным подходом, а скорее UITypeEditor.

Итак, я создал класс, унаследованный от UITypeEditor.Затем вы просто уточняете это так:

public class CustomCollectionModalEditor: UITypeEditor
{
    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        if (context ==null || context.Instance == null)                
            return base.GetEditStyle(context);

        return UITypeEditorEditStyle.Modal;
    }

    public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        IWindowsFormsEditorService editorService;

        if (context == null || context.Instance == null || provider == null)
            return value;

        editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));

        CForm CollectionEditor = new CForm();

        if (editorService.ShowDialog(CollectionEditor) == System.Windows.Forms.DialogResult.OK)
            return CollectionEditor.Programmed;

        return value;
        //return base.EditValue(context, provider, value);
    }
}

Ключевыми частями, на которые следует обратить внимание, являются функции GetEditStyle и EditValue.Часть, ответственная за запуск Формы, созданной вами для редактирования вашей коллекции, находится в функции переопределения EditValue.

CForm - это пользовательская форма редактора коллекции, которую я разработал в этом тесте для редактирования коллекции.Вам нужно получить IWindowsFormsEditorService, связанный с IServiceProvider, и просто вызвать .ShowDialog(formVariable) из IWindowsFormsEditorService, чтобы показать форму, созданную вами для редактирования коллекции.Затем вы можете catch возвращенное DialogResult значение из вашей Формы и выполнить любую пользовательскую обработку, которая вам требуется.

Я надеюсь, что это кому-то поможет, так как мне понадобилось немало копать, чтобы определить правильный путьчтобы включить это.

0 голосов
/ 16 февраля 2016

Это отвечает на вопрос Брэндона. Я тоже искал долго и упорно о том, как на самом деле заменить редактор сбора PropertyGrid по умолчанию. Ответ Натана был окончательным решением. Брэндон, вот как я смог использовать решение Натана и использовать свой собственный редактор коллекций.

using Swfd = System.Windows.Forms.Design;
using Scm = System.ComponentModel; 
using Sdd = System.Drawing.Design;
public class CustomCollectionModalEditor : Sdd.UITypeEditor
{
public override Sdd.UITypeEditorEditStyle GetEditStyle(Scm.ITypeDescriptorContext context)
{
    if (context == null || context.Instance == null)
    return base.GetEditStyle(context);

    return Sdd.UITypeEditorEditStyle.Modal;
}

public override object EditValue(Scm.ITypeDescriptorContext context, IServiceProvider provider, object value)
{
    Swfd.IWindowsFormsEditorService editorService;

    if (context == null || context.Instance == null || provider == null)
    return value;

    editorService = (Swfd.IWindowsFormsEditorService)provider.GetService(typeof(Swfd.IWindowsFormsEditorService));

    //CForm CollectionEditor = new CForm();
    //---  Replaced the Collection from this post with mine which requires an argument that passes the collection
    Ccne.CustomCollection editgcp = new Ccne.CustomCollection();  // Ccne.CustomCollection is my collection
    editgcp = MYGCPS;  // MYGCPS is the actual instance to be edited

    Gcp_Editor.GcpEditorMain CollectionEditor = new Gcp_Editor.GcpEditorMain(editgcp);  // call my editor 

    if (editorService.ShowDialog(CollectionEditor) == System.Windows.Forms.DialogResult.OK)
    {
    MYGCPS = CollectionEditor.ReturnValue1; // update current instance of the collection with the returned edited collection
    THISPG.Refresh();  // calls a method which refreshes the property grid
    return value; // the replaces the statment in the post >> CollectionEditor.Programmed;
    }
    //---
    return value;

    //return base.EditValue(context, provider, value);
}
}


//---------- The propertygrid entry
private Ccne.CustomCollection gCPs; 

[Scm.Category("3 - Optional inputs to run gdal_translate")]
[PropertyOrder(133)]
[Scm.TypeConverter(typeof(Ccne.CustomCollectionConverter))]
[Scm.Editor(typeof(CustomCollectionModalEditor), typeof(Sdd.UITypeEditor))]
[Scm.Description("The Collection of the single or multiple Ground Control Points (Gcp)" +
" entered. \n Each gcp requires a Name, pixel, line, easting, " +
"northing, and optionally an elevation")]
[Scm.RefreshProperties(Scm.RefreshProperties.All)] // /2655660/obnovlenie-propertygrid
[Scm.DisplayName("23 Collection of Gcp's")]
[Scm.ReadOnly(true)]                   // prevents values being changed without validation provided by form
public Ccne.CustomCollection GCPs
{
get { return gCPs; }
set { gCPs = value; }
}

//-------- important code from CollectionEditor i.e. > Gcp_Editor.GcpEditorMain(editgcp)
using Swf = System.Windows.Forms;
namespace Gcp_Editor
{
    public partial class GcpEditorMain : Swf.Form
    {
        public Ccne.CustomCollection ReturnValue1 { get; set; }
        ...
        public GcpEditorMain(Ccne.CustomCollection input1)
        {
                InitializeComponent();
                formcollection = input1;
        }
        ...
        private void OkayBtn_Click(object sender, EventArgs e)
        {
            this.DialogResult = Swf.DialogResult.OK;
            ReturnValue1 = formcollection;
            return;
        }   
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...