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

Создание формы настроек приложения с деревом категорий

01.03.2016, 07:30. Показов 13543. Ответов 33
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Нужно сделать форму на подобие этой


и тут возникла пара вопросов что за элемент с левой стороны? похоже на treeView, или это он и есть только вид другой

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

Спасибо!
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.03.2016, 07:30
Ответы с готовыми решениями:

Создание настроек для приложения
Всем привет. Сегодня задумался вот на какую тему настроек ( параметров, которые постоянно задействованы в программе ): Если...

Таблица с деревом категорий, запросы БД
Приветствую всех. Помогите пожалуйста с реализацией данной задачи : Дана таблица с деревом категорий CREATE TABLE category ( id...

Создание формы с деревом каталогов Outlook для удаления из выбранных папок непрочитанных писем
Привет всем. Необходимо создать форму, на которой динамически строить дерево папок Outlook из элементов CheckBox. Для изменения...

33
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,575
01.03.2016, 07:54
Цитата Сообщение от Slavok47 Посмотреть сообщение
что за элемент с левой стороны?
Это обычный виндовый TreeView (класс контрола SysTreeView32).

Цитата Сообщение от Slavok47 Посмотреть сообщение
при выборе позиции в левой части что то должно появиться в правой, понятно что можно туда добавить динамически созданные контролы, а можно ли как то использовать нарисованные?
Вы можете создать несколько UserControl'ов в дизайнере и показывать/скрывать их в зависимости от выбора в TreeView.
1
2 / 2 / 3
Регистрация: 13.10.2012
Сообщений: 130
01.03.2016, 07:59  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Вы можете создать несколько UserControl'ов в дизайнере и показывать/скрывать их в зависимости от выбора в TreeView.
тут вроде тоже ясно, но смущает то что если элементов будет много, то в дизайнере получится свалка, скрытые же видны
0
 Аватар для Defazze
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
01.03.2016, 08:00
А Вы сделайте TabControl с невидимыми Tab-ами
0
Эксперт .NET
 Аватар для Rius
13238 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,558
Записей в блоге: 14
01.03.2016, 08:07
Defazze, это говнокод. Слушайте Someone007,
UserControl отдельные, а не на форме. Создавать и показывать их динамически, в зависимости от выбора в дереве.
1
 Аватар для Defazze
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
01.03.2016, 08:15
Цитата Сообщение от Rius Посмотреть сообщение
Defazze, это говнокод.
С чего вдруг? Обыкновенное решение.
2
Эксперт .NET
 Аватар для Rius
13238 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,558
Записей в блоге: 14
01.03.2016, 08:26
Defazze, обыкновенное говнокодерское решение. Потому что при большом количестве контролов форма создаётся неадекватно долго. Потому что нельзя просто добавить новые контролы. Потому что свалка кода в дизайнере и куча пересекающихся областей видимости, которые друг к другу никакого отношения не имеют.

Добавлено через 1 минуту
Тяп-ляп продакшн, как я называю...

Добавлено через 2 минуты
Потом отсюда растёт извечный вопрос: "Аааааа, как убрать кнопки у TabPage!?" и костыли, убирающие эти кнопки.
0
 Аватар для Defazze
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
01.03.2016, 08:27
Rius, значит, не говнокодерское решение, а удобное решение, подходящее для формы с небольшим количеством контролов.
0
Эксперт .NET
 Аватар для Rius
13238 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,558
Записей в блоге: 14
01.03.2016, 08:32
Единственное оправдание такого - прототип или предупреждение оверинженеринга. Если так оставить в развивающейся программе, оно перерастает в обычный говнокод со всеми вытекающими и пахнущими последствиями.
0
2 / 2 / 3
Регистрация: 13.10.2012
Сообщений: 130
01.03.2016, 08:34  [ТС]
да динамическое создание элементов это правильно, напрягает только позиционирование...
0
Эксперт .NET
 Аватар для Rius
13238 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,558
Записей в блоге: 14
01.03.2016, 08:36
Slavok47, Вы не поняли.
Можно создать UserControl в дизайнере, как новый класс. В студии есть создание нового контрола.
На него накидать все что нужно.
И вот этот готовый наследник UserControl'а и создавать динамически.

Добавлено через 44 секунды
Для позиционирования его уже можно применять соответствующие контейнеры.
1
2 / 2 / 3
Регистрация: 13.10.2012
Сообщений: 130
01.03.2016, 08:39  [ТС]
Rius, хм, да действительно не понял, буду разбираться
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.03.2016, 08:59
Defazze, При разработке GUI нужно придерживаться тех же правил, что и для любых других ООП обьектов, вы согласны? А раз так, то как же можно пихать на форму кучу совершенно разнородных обьектов, никак не связанных между собой? Это же нарушает и принцип инкапсуляции, и solid, и фактически является антипаттерном, god обьектом.
0
 Аватар для Defazze
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
01.03.2016, 09:18
Storm23, С правилами ООП трудно не согласится ) Но почему мы решили, что форма предназначена для отображения разнородных объектов? Стандартная задача: есть некоторые UserSettings, разбитые по категориям. Представляют из себя по сути один плоский класс с набором свойств. Вот их мы и отображаем. Деление на категории - исключительно пользовательское удобство.

Я ж не говорю, что табы категорически лучше или хуже юзер-контролов. Для каждого подхода есть своя область применения.
0
Эксперт .NETАвтор FAQ
 Аватар для Storm23
10427 / 5157 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
01.03.2016, 09:41
Лучший ответ Сообщение было отмечено Rius как решение

Решение

Цитата Сообщение от Defazze Посмотреть сообщение
Но почему мы решили, что форма предназначена для отображения разнородных объектов? Стандартная задача: есть некоторые UserSettings, разбитые по категориям. Представляют из себя по сути один плоский класс с набором свойств.
А вы часто делаете классы с сотнями свойств? Если число свойств перваливает за десяток, то это явный сигнал к декмопозиции на отдельные классы. Что в случае GUI означает создание отдельных UserControl.

Defazze, Slavok47, Смотрите как это должно быть:
На главной форме лежит один UserControl, содержащий в себе дерево - слева. И пустая панель - справа. Панель - ничего не содержит и является просто контейнером для панелей настроек.
Далее, код главной формы вообще ничего не содержит, кроме одного обработчика. Это обработчик события SelectedNodeChanged дерева. В это обработчике, форма очищает панель справа, и создает UserControl того типа, который передало ему дерево. Создав контрол, отображает его в панели справа. Все.
Таким образом, наша главная форма вообще никак не будет меняться, какие бы новые панели свойств мы не делали, как бы не менялось дерево или как бы не менялись панели свойств - UserControl-ы. Код нашей формы - не будет меняться. Мы его один раз сделали - и забыли о нем. Красиво?
Далее мы просто разрабатываем свои простые UserContol-ы для каждой категории настроек, которые будут инкапсулировать в себе логику и интерфейс каждой категории.
3
 Аватар для Defazze
325 / 136 / 28
Регистрация: 18.09.2014
Сообщений: 167
01.03.2016, 09:52
Цитата Сообщение от Storm23 Посмотреть сообщение
Если число свойств перваливает за десяток, то это явный сигнал к декмопозиции на отдельные классы. Что в случае GUI означает создание отдельных UserControl.
А я с этим и не спорю.

Приведенное Вами решение - превосходное.
0
Эксперт .NET
 Аватар для Rius
13238 / 7733 / 1681
Регистрация: 25.05.2015
Сообщений: 23,558
Записей в блоге: 14
01.03.2016, 09:56
Сюда ещё можно добавить автопоиск контролов настройки через рефлексию или MEF, с формированием дерева. И будет зашибись.
0
2 / 2 / 3
Регистрация: 13.10.2012
Сообщений: 130
01.03.2016, 10:10  [ТС]
Я понял принцип, спасибо!
0
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
17.09.2016, 14:42
Цитата Сообщение от Storm23 Посмотреть сообщение
Красиво?
Красиво, но этот подход имеет ряд недостатков:

1) Возможно придется создавать целую папку UserControlов для каждой такой формы
2) Композиция главной формы во времени разработки ухудшается: мы не видим как UserControl выглядит внутри нашей формы до выполнения программы
3) Нет возможности переключения между панелями во времени разработки
4) Код формы наполняется кодом, который больше относится к сериализации/десериализации контролов. Это отвлекает от логики. Ведь есть специально обученные сериализаторы, пусть они занимаются свойствами контролов в специально отведенном для этого месте
5) Создание насыщенных панелей скажется на производительности
6) При переключении между панелями будут сбиваться такие свойства, как позиция скролла, выбранная ячейка в таблице и т.д. Пользователю придется заново это делать

Вобщем, получается сложная декомпозиция контролов (форма в одном месте, панели в другом) без возможности рациональной композиции во времени разработки. Плюс мы не используем уже готовые решения сериализации времени разработки, мы пишем их сами. Как-то так

Я использую такой контрол для этих случаев. Он тоже не идеален, но вышеперечисленных проблем с ним нет


Логика переключения между панелями при этом сводится к одной строчке:

C#
1
2
tvMain.AfterSelect += (s, e) =>
         ppcMain.SelectedIndex = int.Parse(tvMain.SelectedNode.Tag.ToString());
или так (если нужно обращение по имени панели):
C#
1
2
3
4
5
6
        private enum SelectedPanel { Panel1 = 0, Panel2 = 1, Panel3 = 2 }
 
        private void btPanel1Select_CheckedChanged(object sender, System.EventArgs e)
        {
            ppcMain.SelectedIndex = (int)SelectedPanel.Panel1;
        }
Надеюсь кому-нибудь поможет
1
 Аватар для Serg34
100 / 100 / 33
Регистрация: 20.09.2014
Сообщений: 457
Записей в блоге: 3
17.09.2016, 16:18
Вот, кстати, обыкновенное говнокодерское решение.rar.
Только не вижу тут ни в дизайнере (точнее в файле Form1.Designer.cs) свалки ни кучи пересекающихся областей видимости. Все как в обычном TabControl. Или он тоже нарушает все принципы ООП и оправдание ему прототип или предупреждение оверинжиниринга???
А если нужно логику декомпозировать - никто не мешает те же UserControlы насоздавать и поместить их на вкладки.

Не понимаю, неужели ни у кого не было никогда задачи переключаться между двумя-тремя панелями без использования закладок. Например, между панелью для физических и юридических лиц в зависимости от статуса выбранного клиента.
Вы для этого каждый раз создавали заново всю панель или еще "проще" решения придумывали, запутывая логику и пользователя только потому, что TabControl - это зло?
Почему такая боязнь TabControlа?
Просто для одних задач нужно действительно создавать заново UserControlы, для других этого делать не надо. У каждого способа свои плюсы, свои минусы - нельзя всех под одну гребенку стричь
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.09.2016, 16:18
Помогаю со студенческими работами здесь

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

Создание формы с консольного приложения
Задача: Создать 1 форму. При нажатии SHIFT+5('%') отобразить ее. Проблема: При нажатии '%' создается новая форма, а не отображается...

Пример приложения на C# с деревом и таблицей
Можно ли где скачать пример приложения, чтобы было окно с древовидной структурой и окно с таблицей (строки, колонки)? Для каждой строки...

Создание формы перед главной формой приложения
Как реализовать создание формы перед открытием главной?

Создание одностраничного приложения. Обязательные формы - регистрация, авторизация, главная страница
Создание одностраничного приложения. Обязательные формы - регистрация, авторизация, главная страница. Это надо где то взять хостинг и...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru