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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание дизайнера, Дайте пример дизайнера для C# (НЕ НА VB) 
:(
    Опции темы
Andrew_D
Дата 25.7.2007, 23:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем привет!

Столкнулся с проблемой создания собственного дизайнера для своего контрола  smile . Помогите, пожалуйста, примером. smile 

Пробовал с примера на VB перейти на C#, камнем предкновения стала строка:      CType(Me.Control, NewPanel).GradEditor()
Как я понял, GradEditor() - это метод (или свойство) создаваемого компонента.  smile  Как это написать на C# ???

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


Опытный
**


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

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



вот так показываю форму с диалогом
Код

            private class GroupsEditor : UITypeEditor
            {
                private IWindowsFormsEditorService editorService = null;

                public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
                {
                    editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
                    if (editorService == null)
                    {
                        return value;
                    }

                    UserRights rights = context.Instance as UserRights;
                    if (rights == null)
                    {
                        throw new ArgumentException("Invalid context.");
                    }
                    int userId = rights.row.Id;
                    

                    GroupsForm groupEditor = new GroupsForm(ViewState.DisplayUsers, userId);
                    groupEditor.ShowDialog();
                    return null;
                }

                public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
                {
                    return UITypeEditorEditStyle.Modal;
                }
            }


а вот так выглядит само свойство
Код

            [Editor(typeof(Organizer.Rights.UserRights.GroupsEditor), typeof(UITypeEditor))]
            public string Groups
            {
                get { return null; }
            }


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


Новичок



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

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



Спасибо, сейчас попробую! 

...попробовал.

Если не сложно, расскажи, пожалуйста, по пунктам,  как мне создать рабочий проект с твоим примером

Это сообщение отредактировал(а) Andrew_D - 26.7.2007, 12:27
PM MAIL   Вверх
Naum
Дата 26.7.2007, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 743
Регистрация: 7.9.2005
Где: Саратов, ул. Поса дского, 298

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



Цитата(Andrew_D @  26.7.2007,  00:00 Найти цитируемый пост)
CType(Me.Control, NewPanel).GradEditor()

На C# это будет выглядеть так
Код

((NewPanel)this.Control).GradEditor();



--------------------
У нас всего два праздника Новый год и ТЯПница.
PM MAIL ICQ   Вверх
Andrew_D
Дата 26.7.2007, 13:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо! С этим разобрался...

Возникла друга проблема:

Создал свой конторол MyButton: Button, добавил ему свойство "номер" (private int nomer), добавил метод для доступа к нему

public int Nomer 
        { 
            get { return nomer; } 
            set { nomer = value; }
        }

В этом же классе добавил функцию, которая будет вызываться из дизайнера

public void Number() 
        { 
            
            dialog_number form = new dialog_number();//  мое диалоговое окно для ввода номера
            
            base.Invalidate();// не знаю, взял из примера на VB
            form.Text = this.Nomer.ToString();
            this.Nomer = form.MyShow();// присвоение введеного номера, ф-ия MyShow возвращает введенное значение
            base.Invalidate();// не знаю, взял из примера на VB
            
        }

В дизайнере прописал вызов:  ((Button_D)this.Control).Number();

Суть проблемы: если добавить контрол на форму и сразу же присвоить номер, то номер присваивается (это смотрю в #region Windows Form Designer generated code). Но при следующих попытках изменить номер ничего не выходит!!!

Может быть надо как-то обновлять #region Windows Form Designer generated code?
PM MAIL   Вверх
mihryak
Дата 26.7.2007, 13:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



1. У тебя есть некий класс, одно из св-в которого ты хочешь дизайнить через PropertyGrid.
у меня это св-во
Код

            public string Groups
            {
                get { return null; }
            }

null возвращаю, чтобы ничего не писалось в гриде

2. Нужно создать форму-дизайнер для этого св-ва. Для передачи ей того, что собственно будет редактироваться, нужно завести у этой формы параметризированный конструктор.

3. Теперь создадим класс, отвечающий за вызов этой формы.
Код

            private class GroupsEditor : UITypeEditor
            {
                private IWindowsFormsEditorService editorService = null;

                public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
                {
                    ...
                }
                public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
                {
                    ...
                }
            }

переопределённый метод EditValue() занимается тем, что вызывает форму-дизайнер. При этом параметр ITypeDescriptorContext context содержит в себе свойство Instance, содержащее собственно экземпляр редактируемого класса (не свойство!).
Код

                public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value)
                {
                    editorService = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
                    if (editorService == null)
                    {
                        return value;
                    }
                    UserRights rights = context.Instance as UserRights;
                    if (rights == null)
                    {
                        throw new ArgumentException("Invalid context.");
                    }
                    int userId = rights.row.Id;
                    
                    GroupsForm groupEditor = new GroupsForm(ViewState.DisplayUsers, userId);
                    groupEditor.ShowDialog();
                    return null;
                }

ещё один переопределённый метод GetEditStyle() задаёт тип дизайнера. в нашем случае - модальная форма.
Код

                public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
                {
                    return UITypeEditorEditStyle.Modal;
                }


4. Теперь нужно указать нашему свойству, что оно имеет свой собственный дизайнер, это делается атрубутом Editor, где первый параметр - тип написанного "вызывальщика" формы-дизайнера.
Код

[Editor(typeof(Organizer.Rights.UserRights.GroupsEditor), typeof(UITypeEditor))]


При выборе этого свойства в PropertyGrid'е будет доступна стандартная кнопочка с троеточием, открывающаяя нашу форму-дизайнер.
PM MAIL ICQ   Вверх
Andrew_D
Дата 26.7.2007, 13:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вопрос по пункту 2.
 Как создать форму-дизайнер для свойства? Т.е. в мой компонент добавить NewItem...Windows Form?
PM MAIL   Вверх
mihryak
Дата 26.7.2007, 13:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



ну да, в проект с контролом добавить WinForm
PM MAIL ICQ   Вверх
Andrew_D
Дата 26.7.2007, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



класс  private class GroupsEditor : UITypeEditor  добавлять в мой класс?

почему-то выдает много ошибок... И в reference вроде все подключил...
PM MAIL   Вверх
mihryak
Дата 26.7.2007, 16:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



у меня он определён в том же файле, что и сам класс с редактируемым свойством
в общем-то, это не правильно smile писал давно, сейчас бы поместил в отдельный файл
если будет в отдельном - то private, конечно, нужно заменить на internal или public (второе хуже)
PM MAIL ICQ   Вверх
AndrewD
Дата 26.7.2007, 21:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Извини меня, пожалуйста, что я так туплю (я еще начинающий!), у меня снова проблема!

Вставил твой код в тот же файл, где мой класс :

internal   class GroupsEditor : UITypeEditor
{
.........
}

Происходит следующая ругань:

D:\Андрей\Проекты\Свой интерфейс\forum\Class1.cs(41): The type or namespace name 'UserRights' could not be found (are you missing a using directive or an assembly reference?)
D:\Андрей\Проекты\Свой интерфейс\forum\Class1.cs(42): The name 'rights' does not exist in the class or namespace 'forum.GroupsEditor'
D:\Андрей\Проекты\Свой интерфейс\forum\Class1.cs(46): The type or namespace name 'rights' could not be found (are you missing a using directive or an assembly reference?)
D:\Андрей\Проекты\Свой интерфейс\forum\Class1.cs(48): The type or namespace name 'GroupsForm' could not be found (are you missing a using directive or an assembly reference?)
D:\Андрей\Проекты\Свой интерфейс\forum\Class1.cs(49): The type or namespace name 'groupEditor' could not be found (are you missing a using directive or an assembly reference?)

Что такое UserRights и rights - вообще не понимаю!(такой уж я), а GroupsForm - это наверное public class GroupsForm: Form , т.е. форма-дизайнер ?

И еще вопрос, параметры для конструктора ViewState.DisplayUsers, userId - что за переменные? Что надо добавить на форму-дизайнер?
Может я что-то не подключил?
У меня:
using System;
using System.ComponentModel;
using System.Windows.Forms.Design;
using System.Drawing.Design;
 а в reference:
forum    (-   мой компонент)
System
System.Data
System.Drawing
System.Windows.Forms



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


Опытный
**


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

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



ой  smile 

Цитата(AndrewD @  26.7.2007,  21:33 Найти цитируемый пост)
The type or namespace name 'UserRights' could not be found

UserRights - это мой класс, свойство Groups которого и подлежит отображению в дизайнере. Заменить на свой.
Цитата(AndrewD @  26.7.2007,  21:33 Найти цитируемый пост)
The type or namespace name 'GroupsForm' could not be found

GroupsForm - это класс формы-дизайнера. Заменить на свой

rights и groupForm - просто локальные переменные, после правильно указанных классов всё встанет на свои места.

Цитата(AndrewD @  26.7.2007,  21:33 Найти цитируемый пост)
И еще вопрос, параметры для конструктора ViewState.DisplayUsers, userId - что за переменные? Что надо добавить на форму-дизайнер?

это параметры конструктора формы-дизайнера, у меня - GroupsForm. в большинстве случаев резонно будет передавать в этот конструктор context.Instance as MyClassWithDesignableProperty
PM MAIL ICQ   Вверх
AndrewD
Дата 26.7.2007, 22:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, попробую. Если что, то напишу smile 
PM MAIL   Вверх
mihryak
Дата 27.7.2007, 00:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



вот написал тестик

Присоединённый файл ( Кол-во скачиваний: 24 )
Присоединённый файл  DesignerTest.rar 60,53 Kb
PM MAIL ICQ   Вверх
AndrewD
Дата 31.7.2007, 22:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо большое mihryak !!! Вроде разобрался, но все равно присутствуют косяки smile  


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

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


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

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


 




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


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

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