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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Создание свойств и событий для своего компонента 
:(
    Опции темы
Sunvas
Дата 21.8.2007, 21:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



САБЖ. Вроде бы пишу все правильно:
Код

        public int Runs
        {
            get
            {
             return runcount;
            }
            set 
            {
             runcount = value;
            }
        }

А доступно это свойство (или событие) только программно. Изменить его вручную в таблице Properties невозможно т.к. его там нет.  smile 
Да, и как создать свойство с составными частями (раскрывается + в таблице Properties)?


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
tol05
Дата 22.8.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1632
Регистрация: 21.12.2006
Где: Харьков

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



вот пример набросал. С простым свойством Runs и составным MyClass 
Код

namespace Components
{
    public partial class Form1 :Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    }

    public class MyComponent : Component
    {
        int runcount;
        MyClass myClass;

        public MyComponent()
        {
            InitializeComponent();
        }

        void InitializeComponent()
        {
            myClass = new MyClass();
        }

        public int Runs
        {
            get
            {
                return runcount;
            }
            set
            {
                runcount = value;
            }
        }

        [DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
        public MyClass MyClass
        {
            get
            {
                return myClass;
            }
            set
            {
                myClass = value;
            }
        }
    }

    public class MyClassConverter :ExpandableObjectConverter
    {
        public override bool GetPropertiesSupported(ITypeDescriptorContext context)
        {
            return true;
        }

        public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType)
        {
            if(destinationType == typeof(MyClass)) return true;
            return base.CanConvertTo(context, destinationType);
        }

        public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value,
                                                                            Type destinationType)
        {
            if(destinationType == typeof(String) && value is MyClass)
            {

                MyClass mc = (MyClass)value;
                return "Integer value typing:" + mc.I + ", Boolean value typing: " + mc.B;
            }
            return base.ConvertTo(context, culture, value, destinationType);
        }

        public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
        {
            if(sourceType == typeof(string)) return true;
            return base.CanConvertFrom(context, sourceType);
        }

        public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
        {
            if(value is string)
            {
                try
                {
                    string s = (string)value;
                    int colon = s.IndexOf(':');
                    int comma = s.IndexOf(',');

                    if(colon != -1 && comma != -1)
                    {
                        string integerValueTyping = s.Substring(colon + 1, (comma - colon - 1));

                        colon = s.IndexOf(':', comma + 1);
                        comma = s.IndexOf(',', comma + 1);

                        string booleanValueTyping = s.Substring(colon + 1, (comma - colon - 1));

                        MyClass mc = new MyClass();

                        mc.I = Int32.Parse(integerValueTyping);
                        mc.B = Boolean.Parse(booleanValueTyping);
                        
                        return mc;
                    }
                }
                catch
                {
                    throw new ArgumentException("Can not convert '" + (string)value + "' to type SpellingOptions");
                }
            }
            return base.ConvertFrom(context, culture, value);
        }
    }

    [TypeConverterAttribute(typeof(MyClassConverter)), DescriptionAttribute("Expand to see the MyClass data.")]
    public class MyClass
    {
        private bool b = false;
        private int i = 5;
        
        [DefaultValueAttribute(false)]
        public bool B
        {
            get { return b; }
            set { b = value; }
        }
        [DefaultValueAttribute(5)]
        public int I
        {
            get { return i; }
            set { i = value; }
        }
    }
}



--------------------
На хорошей работе и сны хорошие снятся.
PM MAIL   Вверх
Idsa
Дата 22.8.2007, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(Sunvas @  21.8.2007,  21:52 Найти цитируемый пост)
А доступно это свойство (или событие) только программно. Изменить его вручную в таблице Properties невозможно т.к. его там нет. 

Скорее всего, ты просто проглядел это свойство, т. к. по умолчанию свойства отображаются в Properties.
Цитата

A visual designer typically displays in the Properties window those members that either have no browsable attribute or are marked with the BrowsableAttribute constructor of the value true. These members can be modified at design time. Members marked with the BrowsableAttribute constructor of the value false are not appropriate for design-time editing and therefore are not displayed in a visual designer. The default is true.

Т. е. если атрибут [Browsable(false)] указан, то свойство не будет отображено в Properties. Атрибут же [Browsable(true)] фактически повторяет поведение по умолчанию.

Это сообщение отредактировал(а) Idsa - 22.8.2007, 15:01


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Sunvas
Дата 22.8.2007, 18:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Idsa, ничего я не проглядел. Уверяю Вас.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Idsa
Дата 22.8.2007, 18:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Sunvas, тогда поставьте для верности [Browsable(true)] для этого свойства:
Код

[Browsabe(true)]
  public int Runs
        {
            get
            {
             return runcount;
            }
            set 
            {
             runcount = value;
            }
        }

Помогло?
Если нет, то хотелось бы увидеть код компонента, ну или хотя бы dll'ку.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
Sunvas
Дата 22.8.2007, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



Idsa, так. Оказывается если закрыть и открыть проект - свойство таки появляется.. 
Но все-таки остается открытым вопрос, как "упаковать" несколько свойств в группу, которая бы открывалась +?
Т.е. создать группу с названием, скажем cells, а в нее добавить 2 свойства - runcount и color;

ЗЫ. Нужно создать кнопку в клеточку..


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
thomas
Дата 22.8.2007, 21:20 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Доцент... почти
***


Профиль
Группа: Завсегдатай
Сообщений: 1385
Регистрация: 3.10.2006
Где: " Сказочное королевство"

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



Sunvas
Приветствую
Цитата

Нужно создать кнопку в клеточку.. 

Если ты имеешь в виду кнопочку для вызова диалога редактирования свойства, то я делал так для PropertyGrid
написал два отдельных класса
Код

Public Class clsFileNameEditor
    Inherits Global.System.Drawing.Design.UITypeEditor

    Public Overrides Function GetEditStyle(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Global.System.Drawing.Design.UITypeEditorEditStyle
        Return Global.System.Drawing.Design.UITypeEditorEditStyle.Modal
    End Function

    Public Overrides Function EditValue(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal provider As System.IServiceProvider, ByVal value As Object) As Object

        Dim f As New OpenFileDialog()
        f.Filter = "Access File(*.mdb)|*.mdb"
        f.ShowDialog()
        Return f.FileName
    End Function
End Class
Public Class clsPathEditor
    Inherits Global.System.Drawing.Design.UITypeEditor

    Public Overrides Function GetEditStyle(ByVal context As System.ComponentModel.ITypeDescriptorContext) As Global.System.Drawing.Design.UITypeEditorEditStyle
        Return Global.System.Drawing.Design.UITypeEditorEditStyle.Modal
    End Function

    Public Overrides Function EditValue(ByVal context As System.ComponentModel.ITypeDescriptorContext, ByVal provider As System.IServiceProvider, ByVal value As Object) As Object

        Dim f As New FolderBrowserDialog()
        f.ShowDialog()
        Return f.SelectedPath
    End Function
End Class 

И вызывал их так
Код

<Global.System.ComponentModel.CategoryAttribute("User"), _
         Global.System.ComponentModel.DescriptionAttribute("Map waar Excel bestanden zich bevinden."), _
         Global.System.Configuration.UserScopedSettingAttribute(), _
         Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
         Global.System.Configuration.DefaultSettingValueAttribute(""), _
         Global.System.ComponentModel.EditorAttribute(GetType(clsPathEditor), GetType(System.Drawing.Design.UITypeEditor))> _
        Public Property DirectoryExcelFiles() As String
            Get
                Return CType(Me("DirectoryExcelFiles"), String)
            End Get
            Set(ByVal value As String)
                Me("DirectoryExcelFiles") = value
            End Set
        End Property 

Тоесть  подставлял здесь
Код

 Global.System.ComponentModel.EditorAttribute(GetType(clsPathEditor), GetType(System.Drawing.Design.UITypeEditor))

Кстати про группы
Код

Global.System.ComponentModel.CategoryAttribute("User")
 создает группу свойств "user"



Это сообщение отредактировал(а) thomas - 22.8.2007, 21:20


--------------------
Крепко жму горло, искренне ваш Thomas. (С)vingrad
Некоторые сорта флоры буквально за одно мгновение превращают нас в фауну!
Проблемы негров шерифа не волнуют.
PM MAIL   Вверх
Sunvas
Дата 22.8.2007, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


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

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



thomas, мне нужно тупо разукрасить кнопку в решетку #. Но за код спасибо, но мне нужно на C# это сделать.


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Idsa
Дата 23.8.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Sunvas, для кнопки есть отдельная тема. Давайте не будем все мешать в одну кучу.

Цитата(Sunvas @  22.8.2007,  19:33 Найти цитируемый пост)
Но все-таки остается открытым вопрос, как "упаковать" несколько свойств в группу, которая бы открывалась +?
Т.е. создать группу с названием, скажем cells, а в нее добавить 2 свойства - runcount и color;

Обычно для этого пишут TypeConverter'ы... Реализацию контрола с TypeConverter'ами выше приводил tol05.
Однако зачастую гораздо проще обойтись универсальными TypeConvert'ами. Один из них рассмотрен вот здесь.


--------------------
Мой блог: alexidsa.blogspot.com
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

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


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




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


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

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