Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
1

Кастомное свойство UserControl

29.09.2015, 11:34. Показов 3694. Ответов 8
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Первый раз пишу свой компонент, В общем не получается добавить новое свойство на панель свойств, а при добавлении этого контрола на форму VS2008 вылетает...Код контрола:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
public partial class ButtonOnOff : UserControl
    {
        public ButtonOnOff()
        {
            InitializeComponent();
        }
        Pen mypen = new Pen(Brushes.Gray, 1);
        protected override void OnPaint(PaintEventArgs e)
        {
            int _Width = Convert.ToInt32(ClientSize.Width);
            int _Height = Convert.ToInt32(ClientSize.Height);
            e.Graphics.FillEllipse(new SolidBrush(BackColor), 0, 0, _Width - 2, _Height - 2);
            e.Graphics.DrawEllipse(mypen, +1, +1, _Width - 3, _Height - 3);
            //e.Graphics.FillEllipse(new SolidBrush(Colorr()), ClientSize.Width / 10, ClientSize.Width / 10, ClientSize.Width / 5, ClientSize.Width / 5);
        }
        protected override void OnPaintBackground(PaintEventArgs e)
        {
            e.Graphics.FillRectangle(new SolidBrush(Parent.BackColor), ClientRectangle);
        }
        public Color Colorr()
        {
            if (FlagOnOff)
                return Color.Aqua;
            else
                return Color.Gray;
        }
        [DisplayName(@"FlagOnOff"), Description("бла"), Category("Новое"), DefaultValue(false)]
        public bool FlagOnOff
        {
            get
            {
                return this.FlagOnOff;
            }
            set
            {
                this.FlagOnOff = value;
            }
        }
    }
Надо переменную FlagOnOff добавить в свойства контрола..
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.09.2015, 11:34
Ответы с готовыми решениями:

Пустое свойство Parent у UserControl
Создал ЮзерКонтрол включающий в себя ТекстБокс. От этого ЮзерКонтрола унаследовал два других...

Данные не попадают в свойство LinkData компонента UserControl
Здравствуйте! Помогите пожалуйста разобраться, почему у меня данные не по подают в свойство...

Через свойство своего UserControl вызвать другую форму и передать в неё данные
Добрый день, друзья! Создал свой UserControl и в нем прописал свойство public Form frm; public...

Как изменить свойство Visible/Enable у кнопки на форме по команде из UserControl и почему не срабатывает логическое И?
Всем привет. Вроде уже не нуб в шарпе, но тут с элементарным запарился. Вопросов 2 : 1. Есть...

8
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
29.09.2015, 11:55 2
Цитата Сообщение от Рядовой Посмотреть сообщение
C#
1
2
3
4
5
6
7
8
9
10
11
        public bool FlagOnOff
        {
            get
            {
                return this.FlagOnOff;
            }
            set
            {
                this.FlagOnOff = value;
            }
        }
Этот код преобразуется компилятором в такой:
C#
1
2
3
4
5
6
7
8
9
public bool GetFlagOnOff()
{
   return GetFlagOnOff();
}
 
public void SetFlagOnOff(bool value)
{
   SetFlagOnOff(value);
}
Видите, что происходит?
0
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
29.09.2015, 12:00  [ТС] 3
C#
1
2
3
4
5
6
7
8
9
public bool GetFlagOnOff()
{
   return GetFlagOnOff();
}
 
public void SetFlagOnOff(bool value)
{
   SetFlagOnOff(value);
}
Бесконечная рекурсия? А как тогда просто отправить значение переменной если не return this.FlagOnOff?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
29.09.2015, 12:25 4
Лучший ответ Сообщение было отмечено Рядовой как решение

Решение

Цитата Сообщение от Рядовой Посмотреть сообщение
Бесконечная рекурсия?
Так точно, что в итогде взрывает стэк.

Цитата Сообщение от Рядовой Посмотреть сообщение
А как тогда просто отправить значение переменной если не return this.FlagOnOff?
Либо создайте закрытое поле, в котором будет храниться значение:
C#
1
2
3
4
5
6
7
8
9
10
11
12
        private bool _flagOnOff;
        public bool FlagOnOff
        {
            get
            {
                return this._flagOnOff;
            }
            set
            {
                this._flagOnOff= value;
            }
        }
Либо сделайте свойство автореализуемым:
C#
1
2
3
4
5
public bool FlagOnOff
{
   get;
   set;
}
Вторая конструкция будет преобразована компилятором в первую.
0
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
29.09.2015, 13:02  [ТС] 5
Блин, просто гет сет... Все работает, спасибо))

Добавлено через 31 минуту
kolorotur, а не подскажите как давать пользователю возможность задавать лишь круглую область? сам попытался сделать так, но не выходит.
C#
1
2
3
4
protected override Size SizeFromClientSize(Size clientSize)
        {
            return new Size(clientSize.Height, clientSize.Height);
        }
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
29.09.2015, 14:22 6
Цитата Сообщение от Рядовой Посмотреть сообщение
как давать пользователю возможность задавать лишь круглую область?
Проще всего разрешить задавать любую область, а отрисовывать только круглую:

C#
1
2
3
4
5
6
7
8
protected override void OnPaint(PaintEventArgs e)
{
    int size = Math.Min(ClientSize.Width, ClientSize.Height);
    int x = (ClientSize.Width - size) / 2;
    int y = (ClientSize.Height - size) / 2;
    e.Graphics.FillEllipse(new SolidBrush(BackColor), x, y, size, size);
    e.Graphics.DrawEllipse(mypen, x, y, size, size);
}
Если хотите разрешить только квадратный размер контрола, то перво-наперво создайте соответствующее свойство, чтобы пользователю не вводить всякую ерунду в Size:
C#
1
2
3
4
5
6
7
8
9
10
11
12
[Category("Layout")]
public int Diameter
{
    get
    {
        return Size.Height;
    }
    set
    {
        Size = new Size(value, value);
    }
}
Затем переопределите метод OnSizeChanged, где делайте поправку значений для особо ушлых пользователей:
C#
1
2
3
4
5
6
protected override void OnSizeChanged(EventArgs e)
{
    if (Size.Height != Size.Width)
        Diameter = Math.Max(Size.Height, Size.Width);
    base.OnSizeChanged(e);
}
Учтите, что это так же наложит ограничение на изменение размера путем перетаскивания в дизайнере: данный вариант, например, не позволит изменять только ширину.
Так что код модифицируйте под свои нужды.
1
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
29.09.2015, 17:37  [ТС] 7
Работает, благодарю. kolorotur, только одного не пойму, свойство диаметр то мы задали, но кто обращается к нему? Мы же не указывали нигде что надо брать значение из него а не из ClientSize?
0
Эксперт .NET
17688 / 12873 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
29.09.2015, 18:36 8
Цитата Сообщение от Рядовой Посмотреть сообщение
кто обращается к нему?
Например, пользователь в дизайнере.

Цитата Сообщение от Рядовой Посмотреть сообщение
Мы же не указывали нигде что надо брать значение из него а не из ClientSize?
Свойство Diameter изменяет свойство Size, а уж оно в свою очередь влияет на ClientSize.
0
1514 / 905 / 328
Регистрация: 17.05.2015
Сообщений: 3,417
29.09.2015, 19:02  [ТС] 9
Цитата Сообщение от kolorotur Посмотреть сообщение
Например, пользователь в дизайнере.
Я имел ввиду что работает только блок set - в этой строке
C#
1
Diameter = Math.Max(Size.Height, Size.Width);
get использует только дизайнер для выводе значения... или нет?

Добавлено через 1 минуту
А разобрался - блок set и меняет значение ClientSize
0
29.09.2015, 19:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.09.2015, 19:02
Помогаю со студенческими работами здесь

Как разместить UserControl поверх другого UserControl
Такая задача. Есть форма. На ней размещена панель panelRight. Также есть два пользовательских...

Не работает свойство зависимости в UserControl
Не понимаю, в чём проблема. Был создан UserControl в ClassLibrary, положен на основное окно. Внутри...

Свойство DisplayMemberPath в своего UserControl
Всем добрый день. Я разрабатываю свой элемент (CheckBoxList), и хочу чтобы можно было указать в до...

Реализовать свойство UserControl, принимающее массив
Есть UserControl в него надо передать двумерный массив, примерно как это работает в ListBox`е со...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru