Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите добавить дизайнер к компоненту 
:(
    Опции темы
Serjeo
Дата 30.7.2007, 13:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Есть некоторый собственный компонент:
public partial class SimpleComponent : Component
{
...
}
и есть произвольная форма куда я из toolbox-а перекидываю значок собственного компонента. Что нужно указать в атрибутах, чтобы при выделении этого значка на форме я мог редактировать все свойства собственного компонента в окне Properties? Что вообще нужно написать?  

PM MAIL   Вверх
mihryak
Дата 30.7.2007, 13:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 2
Всего: 36



да ничего особого можно не указывать, просто объявить свойства публичными - у меня вполне так работает

а по собственно дизайнерам я тут написал примерчик..

PM MAIL ICQ   Вверх
Serjeo
Дата 30.7.2007, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Возможно я не могу понять простого. Если не трудно, объясните. Есть собственный компонент в *.dll исполнении. Внутри есть два свойства с простым типом и один с вложенным собственнымю. Я перетаскиваю этот компонент из toolbox-а на вновь созданную форму. В окне Properties первые два свойства могу изменять, а вложенное нет. В чем причина. Как мне установить дизайнер для этого свойства?.  Вот код компонента:


Код

using System;
using System.ComponentModel;

using System.ComponentModel.Design;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;

namespace My.Components
{

    
    /// <summary>
    /// Объявляем делегат для события
    /// </summary>
    public delegate void FlyDelegate(string MessageText);
    /// <summary>
    /// Объявляем класс для изменений
    /// </summary>
    public partial class SimpleComponent : Component
    {

        public SimpleComponent()
        {
            InitializeComponent();
        }

        public SimpleComponent(IContainer container)
        {
            container.Add(this);

            InitializeComponent();
        }

        public SimpleComponent(string str)
        {
            InitializeComponent();            
        }

        #region Описание полей и свойств

        /// <summary>
        /// Поле 1
        /// </summary>
        private int FProperty1 = 1234567;
        /// <summary>
        /// Свойство 1
        /// </summary>
        public int Property1
        {
            get
            {
                return FProperty1;
            }
            set
            {
                FProperty1 = value;
            }
        }

        /// <summary>
        /// Поле 2
        /// </summary>
        private string FProperty2 = "Первичное значение";
        /// <summary>
        /// Свойство 2
        /// </summary>
        public string Property2
        {
            get
            {
                return FProperty2;
            }
            set
            {
                FProperty2 = value;
            }
        }


        /// <summary>
        /// Поле 3
        /// </summary>
        private PropertyType FProperty3 = new PropertyType();
        /// <summary>
        /// Свойство 3
        /// </summary>
        public PropertyType Property3
        {
            get
            {
                return FProperty3;
            }
            set
            {
                FProperty3 = value;
            }
        }

        /// <summary>
        /// Переменная для вывода сообщения
        /// </summary>
        string sValue;

        #endregion Описание полей и свойств

        #region Описание перегруженного метода Change

        /// <summary>
        /// Перегружаем метод Change - параметр типа int
        /// </summary>
        public void Change(int Property)
        {
            sValue = "Старое значение: " + FProperty1;
            FProperty1 = Property;
            sValue += "\nНовое значение: " + Property.ToString();
            OnChanged(sValue);
        }
        /// <summary>
        /// Перегружаем метод Change - параметр типа string
        /// </summary>
        public void Change(string Property)
        {
            sValue = "Старое значение: " + FProperty2;
            FProperty2 = Property;
            sValue += "\nНовое значение: " + Property;
            OnChanged(sValue);
        }

        #endregion

        #region Описание перегруженного метода ToString

        /// <summary>
        /// Перегружаем метод ToString
        /// </summary>
        public string ToString(DateTime D1, DateTime D2, bool B)
        {
            return D1.ToString("dd.MM.yyyy") + " " + D2.ToString("dd.MM.yyyy") + " " + B.ToString(); ;
        }

        /// <summary>
        /// Перегружаем метод Change
        /// </summary>
        public override string ToString()
        {
            return Property3.Date1.ToString("dd.MM.yyyy") + " " + Property3.Date1.ToString("dd.MM.yyyy") + " " + Property3.TmInterval.ToString();
        }

        #endregion

        #region Для события

        /// <summary>
        /// Событие на изменение свойства
        /// </summary>
        public event FlyDelegate ClEvent;
        /// <summary>
        /// Метод для генерирования события
        /// </summary>
        public void OnChanged(string InputMessage)
        {
            if (ClEvent != null)
            {
                ClEvent(InputMessage);
            }
        }

        #endregion

        #region Описание типа PropertyType

        /// <summary>
        /// Описание типа PropertyType
        /// </summary>

        [Designer(typeof(PropertyType))]
        public class PropertyType : Component
        {
            /// <summary>
            /// Поле Date1
            /// </summary>
            private DateTime FDate1 = DateTime.Now;

            /// <summary>
            /// Свойство Date1
            /// </summary>
            public DateTime Date1
            {
                get
                {
                    return FDate1;
                }
                set
                {
                    FDate1 = value;
                }
            }

            /// <summary>
            /// Поле Date2
            /// </summary>
            private DateTime FDate2 = DateTime.Now;

            /// <summary>
            /// Свойство Date2
            /// </summary>
            public DateTime Date2
            {
                get
                {
                    return FDate2;
                }
                set
                {
                    FDate2 = value;
                }
            }

            /// <summary>
            /// Поле Bool
            /// </summary>
            private bool FTmInterval = false;

            /// <summary>
            /// Свойство Bool
            /// </summary>
       
            public bool TmInterval
            {
                get
                {
                    return FTmInterval;
                }
                set
                {
                    FTmInterval = value;
                }
            }

        }

        #endregion

    }
}

PM MAIL   Вверх
mihryak
Дата 30.7.2007, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 2
Всего: 36



Код

        [TypeConverterAttribute(typeof(System.ComponentModel.ExpandableObjectConverter))]
        public class PropertyType : Component
        {
                ......
        }

Код

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public PropertyType Property3
        {
                ......
        }


в примерчике это есть ;)

Это сообщение отредактировал(а) mihryak - 30.7.2007, 14:36
PM MAIL ICQ   Вверх
Serjeo
Дата 30.7.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Цитата(mihryak @  30.7.2007,  14:36 Найти цитируемый пост)
Код

        [TypeConverterAttribute(typeof(System.ComponentModel.ExpandableObjectConverter))]
        public class PropertyType : Component
        {
                ......
        }

Код

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public PropertyType Property3
        {
                ......
        }


в примерчике это есть ;)
PS: Помогите добавить дизайнер к компоненту:.

Я сделал все как описано, но свойство Property3 в окне Properties все равно неактивно и там написано: My.Components.SimpleComponent+PropertyType. Что нужно написать, чтобы можно было редактировать это свойство. Заранее спасибо!
PM MAIL   Вверх
mihryak
Дата 30.7.2007, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 2
Всего: 36



а ребилд не помогает?

ПС. это странно, но у меня теперь и исходный вариант нормально редактируется smile


Присоединённый файл ( Кол-во скачиваний: 9 )
Присоединённый файл  property.PNG 3,80 Kb
PM MAIL ICQ   Вверх
Serjeo
Дата 30.7.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Цитата(mihryak @  30.7.2007,  15:48 Найти цитируемый пост)
а ребилд не помогает?

ПС. это странно, но у меня теперь и исходный вариант нормально редактируется smile
PS: Помогите добавить дизайнер к компоненту:.


Все работает. Спасибо огромное!
PM MAIL   Вверх
Serjeo
Дата 31.7.2007, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



А как сделать так, чтобы можно было редактировать свойства своего компонента не через окно Properties, а используя свою новую форму? Заранее спасибо!
PM MAIL   Вверх
mihryak
Дата 31.7.2007, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 2
Всего: 36



Serjeo, вот только честно, ты примерчик скачал? там есть редактирование и через PropertyGrid, и через свою форму.
PM MAIL ICQ   Вверх
Serjeo
Дата 31.7.2007, 11:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Я имел ввиду редактирование свойств в Design-time. Там разве для этого?
PM MAIL   Вверх
mihryak
Дата 31.7.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 2
Всего: 36



Может, я как-то не так понял, но в Design-time, если не раскрывать свойство Properties моего контрола, а просто кликнуть, то откроется форма для редактирования. В Run-time то же самое произойдёт, если на форме в компоненте PropertiesGrid выбрать это же свойство.

Ну а в общем, нужно написать наследника для UITypeEditor и аттрибутом [Editor(typeof(MyPropertiesEditor), typeof(UITypeEditor))] задать его свойству.

-------
а, понял, похоже. PropertiesGrid - это не только контрол на моей форме в примере, но и редактор свойств в самой студии

Это сообщение отредактировал(а) mihryak - 31.7.2007, 11:15
PM MAIL ICQ   Вверх
Serjeo
Дата 1.8.2007, 08:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Все, я разобрался. В Properties моего компонента  появляется строка Property1, напротив которой кнопочка с тремя точками. При нажатии на нее появляется моя форма для редактирования этого компонента и все это в Design-time. А вот теперь не могу разобраться почему все то, что я изменил не сохраняется после повторного закрытия открытия этой формы. Здесь нужно что-то сериализировать?
PM MAIL   Вверх
mihryak
Дата 1.8.2007, 09:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 731
Регистрация: 28.4.2007
Где: С-Пб

Репутация: 2
Всего: 36



Serjeo, без кода сложно сказать
Есть подозрение, что неправильно написал метод EditValue. Если в форме были выставлены новые значения и свойство имеет сложный тип (собственный класс), то нужно сформировать новый экземпляр этого класса и возвратить его в этом методе. Если не сделать этого, возвращая тот же экземпляр, но с изменёнными внутренними свойствами, то студия сравнит сами экземпляры, увидит, что это один и тот же, и не предпримет никаких действий.
Второе подозрение - при создании формы её собственные контролы не конфигурятся текущим значением редактируемого свойства.

Это сообщение отредактировал(а) mihryak - 1.8.2007, 09:35
PM MAIL ICQ   Вверх
Serjeo
Дата 1.8.2007, 09:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 26
Регистрация: 30.7.2007

Репутация: нет
Всего: нет



Вот код:

Код

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Drawing.Design;
using System.Windows.Forms.Design;
using System.Drawing;
using System.Windows.Forms;

namespace My.Components
{
    
    public class PropertyEditor : System.Drawing.Design.UITypeEditor
    {
        public PropertyEditor()
        {
        }
        public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        {
            if (context != null)
            {
                return UITypeEditorEditStyle.Modal;
            }
            else
                return base.GetEditStyle(context);
        }
        public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, System.IServiceProvider provider, object value)
        {
            IWindowsFormsEditorService edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            using (PropertyForm form = new PropertyForm())
            {

                edSvc.ShowDialog(form);
            }
            return value;
        }
    }
}


а это участок кода компонента:

Код

        [BrowsableAttribute(true),
        Editor(typeof(PropertyEditor), typeof(System.Drawing.Design.UITypeEditor))]
        public PropertyType Property3
        {
            get
            {
                return FProperty3;
            }
            set
            {
                FProperty3 = value;
            }
        }


Может нужна сериализация в дизайнере формы, куда я перетаскиваю компонент:

Код

            // 
            // simpleComponent1
            // 
            this.simpleComponent1.Property1 = 1234567;
            this.simpleComponent1.Property2 = "Первичное значение";
            this.simpleComponent1.Property3 = null;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0591 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.