Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 20

Пользовательский элемент управления (listBox с возможностью закрашивания определенных элементов)

02.06.2012, 16:28. Показов 2073. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет. Появилась необходимость создать элемент listBox с возможностью закрашивания определенных элементов.
Добавил к проекту новый элемент (пользовательский): Project -> Add User Control. Затем унаследовал полученный класс от ListBox и получил в итоге такой код:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
public partial class ColoredListBox : ListBox
    {
        protected Color foreColor;
        protected Color backColor;
 
        public ColoredListBox()
        {
            InitializeComponent();
            SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint, true);
        }
 
        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            base.OnDrawItem(e);
            Subject currentSubject = (Subject)Items[e.Index];
 
            // если требуется окраска
            if (currentSubject.isColored)
            {
                this.foreColor = Color.Gray;
                this.BackColor = Color.Transparent;
            }
            else
            {
                this.ForeColor = Color.Black;
                this.backColor = Color.Transparent;
            }
 
            SolidBrush sb = new SolidBrush(this.backColor);
            e.Graphics.FillRectangle(sb, e.Bounds);
            sb.Dispose();
            if (!string.IsNullOrEmpty(currentSubject.subjectName))
            {
                TextRenderer.DrawText(e.Graphics, currentSubject.subjectName, e.Font, e.Bounds, this.foreColor, this.backColor, TextFormatFlags.VerticalCenter | TextFormatFlags.Left);
            }
 
        }
 
        protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);
 
            for (int i = 0; i < Items.Count; i++)
            {
                Rectangle itemRectangle = GetItemRectangle(i);
 
                if (e.ClipRectangle.IntersectsWith(itemRectangle))
                {
                    if (SelectedIndices.Contains(i))
                    {
                        DrawItemEventArgs diea = new DrawItemEventArgs(e.Graphics, this.Font, itemRectangle, i, DrawItemState.Selected);
                        OnDrawItem(diea);
                    }
                    else
                    {
                        DrawItemEventArgs diea = new DrawItemEventArgs(e.Graphics, this.Font, itemRectangle, i, DrawItemState.None);
                        OnDrawItem(diea);
                    }
                }
            }
        }
    }
Затем собрал проект заново: Project -> Build
Появился новый элемент в панели ToolBox. Но когда пытаюсь добавить его на форму, вылазит ошибка
http://funkyimg.com/u2/1748/34... ______.png

Помогите разобраться, пожалуйста.

Еще вспомнил проблему - можно-ли как-то определить конкретное свойство для каждого объекта Item? Например, чтобы при перерисовке определялось каким цветом нужно рисовать определенный объект item. В текущем случае я использую ссылку на объект Subject, который и отображается в ListBox, и уже в классе Subject я сделал свойство, которое определяет цвет прорисовки item в ListBox. Но так будет работать только в том случае, когда класс Subject описан в том же пространстве, что и сам пользовательский элемент. Хотелось бы абстрагироваться от Subject и работать напрямую с каждым из элементов ListBox.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.06.2012, 16:28
Ответы с готовыми решениями:

Пользовательский элемент управления. Как добавить на панель элементов?
Собственно вот и вопрос. Сделал элемент, выполнил построение решения, выполнил перестроение решения. А как элемент на форму кинуть? Вроде...

Пользовательский элемент управления
Помгите! Надо создать элемент управления (в виде трапеции) чтобы при клике на нем менялся цвет сего элемента управления.

Пользовательский элемент управления
Привет всем! Вопрос собственно по теме. Как его создать? Очень мало информации в интернете и на YouTube. Я вроде бы разобрался с простыми...

2
 Аватар для Alex_Sabaka
638 / 499 / 77
Регистрация: 28.07.2010
Сообщений: 895
02.06.2012, 16:58
Цитата Сообщение от Jack Sparrow Посмотреть сообщение
Помогите разобраться, пожалуйста.
А не могли бы вы написать путь(папку) в которой находится ваш проект, в частности юзерконтрол.
Цитата Сообщение от Jack Sparrow Посмотреть сообщение
Еще вспомнил проблему - можно-ли как-то определить конкретное свойство для каждого объекта Item?
Как вариант: объявляете в контроле проперти
C#
1
public string FieldOfTypeForColorization{get;set;}
и потом при отрисовке итема
C#
1
2
3
4
5
6
7
8
9
        protected override void OnDrawItem(DrawItemEventArgs e)
        {
            base.OnDrawItem(e);
            object currentSubject = Items[e.Index];
            Type objType = currentSubject.GetType();
            PropertyInfo mi = objType.GetProperty(this.FieldOfTypeForColorization, BindingFlags.Public);
            if (mi == null || mi.PropertyType != typeof(Color)) throw new Exception();
            Color color = (Color)mi.GetValue(currentSubject, null);
            // если требуется окраска
это конечно же костыль, но ничего красивее не придумал.
0
2 / 2 / 0
Регистрация: 27.12.2010
Сообщений: 20
02.06.2012, 18:20  [ТС]
Ой точно путь не помню, но в нем точно до 100 символов, есть русские буквы и пробелы

Добавлено через 30 минут
Решил проблему немного по-другому. Не хочет проект брать контрол когда его создаешь внутри самого проекта. Создал новый проект (class library type), в нем написал весь код, откомпилировал и получил .dll файл, его добавил в toolbox главного проекта и в references того же проекта. Эта ошибка перестала вылетать.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.06.2012, 18:20
Помогаю со студенческими работами здесь

Простенький пользовательский элемент управления
Доброго времени суток, уважаемые программисты. Решил я написать простенький user control :) Написать, дабы хотя бы чуток улучшить...

Пользовательский элемент управления и конструктор
Создал свой элемент управления, при компиляции отображается и работает как часы (собсна часы и делал:)), НО при загрузке конструктора форм...

Пользовательский элемент управления Edit
Привет,ребята,нужна помощь,нужно создать пользовательский элемент управления Edit(я создал) и теперь нужно организовать проверку вводимых...

Пользовательский элемент управления и события
Собственно проблема состоит в том, что у меня есть некая переменная: public static DependencyProperty CurrentFileProperty = ...

Как использовать пользовательский элемент управления
http://visualstudiogallery.msdn.microsoft.com/650e5ef4-1444-4f9c-adc5-89a3bb0e9f90 Да я могу его в проект запихать, но как сделать...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru