none
Разработка контрола-редактора класса RRS feed

  • Вопрос

  • Добрый день!

    В нашем проекте достаточно много форм редактирования. Причем каждая форма редактирует объект какого-либо класса.

    К примеру, имеется класс

        public class Person {
            public string FullName { get; set; }
            public DateTime BirthDate { get; set; }
            public decimal Income { get; set; }
            public Person[] Parents { get; set; }
        }

    И контрол, который должен формировать форму для редактирования

        [Designer(typeof(System.Windows.Forms.Design.ParentControlDesigner))]
        public partial class ClassEditor : UserControl {
            private string _className;
    
            public ClassEditor() {
                InitializeComponent();
            }
    
            public string ClassName {
                get { return _className; }
                set {
                    _className = value;
                    if (String.IsNullOrEmpty(_className)) {
                        this.Controls.Clear();
                        return;
                    }
                    var type = Type.GetType(_className);
                    if (type != null) {
                        foreach (var property in type.GetProperties()) {
                            var control = GetPropertyEditor(property);
                            LocateControl(control);
                        }
                    }
                }
            }
        }
    

    Соответственно, когда я задаю ClassName = "Person", то на форму добавляются: TextBox, DateTimePicker, NumericUpDown и CollectionEditor(реализован уже).

    Проблема состоит в следующем:

    1. Невозможно дочерним контролам задавать свойства в дизайнере, и самое главное подписываться на события, которые предоставляют эти контролы(TextChanged, CheckedChanged...)

    2. Не самое главное, но все же, как реализовать выбор класса, вместо ввода его имени.

    22 октября 2012 г. 8:50

Все ответы

  • 2. Передавайте сразу тип в контро, вы же все равно внутри его получаете. Т.е. передавайте в класс

    typeof(Person)

    1. А как вы хотите задать свойства в дизайнере WinForms для объектов, которых нет на форме в момент дизайна? Они же добавляются динамически, значит и все свойства и события также нужно задавать динамически в коде. Может можно определить какие-то базовые свойства/события, а потом использовать их.

    Для связи [mail]

    23 октября 2012 г. 7:19
  • 2. Я, наверное, немного неточно выразился. Как реализовать выбор класса прямо в дизайнере. Т.е. как это сделано, к примеру, когда выбираешь в качестве DataSource для репорта Object.

    1. Да, это я уже понял, что в момент дизайна их нет на форме. Получается должно быть что-то(?), что генерирует автоматически код для дизайнера. Ведь что-то(?)  генерирует колонки для DataGridView, когда ему в дизайнере задается dataSource. Имеется ли вообще возможность написать подобное свое "что-то"?

    Определить базовые свойства/события тоже не представляется возможным, т.к. класс, для которого будет строиться форма может быть любым. Соответственно набор свойств и возможных событий неизвестен до момента выбора конкретного класса.

    23 октября 2012 г. 8:31
  • А стандартный PropertyGrid не годится?
    23 октября 2012 г. 8:34
  • Если писать что-то свое - то вам придется писать это как дополнение к самой Visual Studio, это уведет вас от основной задачи.

    Может вам действительно проще попробовать использовать PropertyGrid?

    Пожалуйста, не бросайте топик без ответа


    Для связи [mail]

    25 октября 2012 г. 13:01
  • Я немного не понимаю, чем в моей задаче поможет PropertyGrid.

    По второму вопросу я нашел как это сделать - надо свойству дать атрибут [AttributeProvider(typeof(IListSource))], т.о. я получаю возможность выбрать какой-либо класс из сборки.

    Насчет первого вопроса. Имеется компонент C1InputPanel - вот он делает как раз то, что мне нужно, и без дополнений к студии.

    31 октября 2012 г. 3:45