Multiselect в TreeView

Здесь можно найти готовые «кирпичики» — части кода, пригодные для построения более крупных проектов, а также решения различных типовых и не очень задач на VB.

Модератор: Brickgroup

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Multiselect в TreeView

Сообщение Antonariy » 06.06.2008 (Пт) 17:06

Обычный, всем интуитивно привычный мультиселект. Без привлечения чекбоксов. Работает как с драгом так и с ctrl+клик. Главный минус - не подсвечивает ноды во время тягания рамки. Если кто-то знает, как заставить тривью перерисовать отдельную ноду, не стесняйтесь, пишите, этот минус будет перечеркнут на плюс. Указание других минусов приветствуется.
Вложения
tvm.rar
(48.94 Кб) Скачиваний: 262
Последний раз редактировалось Antonariy 07.06.2008 (Сб) 12:41, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 07.06.2008 (Сб) 5:14

Минус #1:
Некорректное поведение при мультиселекте. Если у меня сейчас выделено А, Б, В, Г, то при повторном щелчке по "Б" выделение с него должно сняться.

У тебя же он, по видимому, снимается, но этого не видно. А не видно потому, что кроме ФокусРекта рисуется и selectionrect (синий), а не должен.

Минус #2
Я не знаю, насколько это минус, но, мне кажется, что если я выделяю ноду, должны выделяться и все её субноды.

Минус #3
Отсутствует возможность выделять с помощью Shift-а. Что если мне нужно выделить все элемены с 5-го по 761-ый? Кликать по каждом с помощью Ctrl?

Минус #4
Если выделить несколько элементов, а по том развернуть какой-нибудь, то множественное выделение сбрасывается и остаётся выделенным только один элемент (тот, который был выбран последним).

Минус #5
По идее, при потере деревом фокуса, выбранные элементы должны отрисовываться серым цветом, чтобы было понятно, что они таки выбраны:
Изображение

Минус #6
При потере / повторном получении фокуса, с множеством выделенных элементов происходит то же, что и в минусе #4 -- остаётся выделенным только тот элемент, который в хронологическом порядке был выбран последним.

Минус #7
Иногда, при закрытии формы, IDE падает.

Минус #8
Иногда, при попытке драгнуть элемент, выделение срывается на предыдущий пункт.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 07.06.2008 (Сб) 9:24

1. Я не нашел способа контролировать отрисовку ноды, которая SelectedItem. Можно отменять изменение SelectedItem при мультиселекте, чтобы всегда оставалось той, с которой началось выделение. ADD: SelectedItem-то, оказывается, еще и для записи. Все поправимо :)
2. Можно добавить такую возможность опционально.
3. Не сделал потому что непонятно, как ноды должны выбираться. Только ноды текущего уровня? Только в текущем parent'е? Включать ли субноды? Целиком или поодиночке? Разворачивать ли при этом ветку?
4,5. Поправлю.
6. Точно так же работает ListView. Насчет последнего элемента - п. 1.
7. Уже знаю почему, исправлю.
8. С драгом пока не совмещал, но предвидел, что будут глюки. :roll:
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16478
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 07.06.2008 (Сб) 9:40

1) Я не нашел способа контролировать отрисовку ноды, которая SelectedItem. Можно отменять изменение SelectedItem при мультиселекте, чтобы всегда оставалось той, с которой началось выделение.

SelectedItem вообще в топку.
Во всех системах с множественным выбором должна быть коллекция SelectedItems и свойство ActiveItem.
Рисовать синим цветом при этом надо пункты, входящие в первую коллекцию, а рисовать FocusItem - только у последнего свойства.

Стрелки (они у тебя отключаются при зажатом Ctrl) должны работать всегда. Стрелки, вообще, должны управлять ActiveItem-ом. Нажатие на пункт или нажатие на пробел должно очищать или удалять из коллекции SelectedItems пункт, на который ссылается ActiveItem и в зависимости от зажатости Ctrl - либо чистить коллекцию вообще, либо не трогать её.

Обрати внимание как это сделано в Explorer-е:
Зажми Ctrl и пробуй нажимать стрелки: у тебя будет двигаться FocusRect (т.е. ActiveItem), а нажатием при этом пробелы то сможешь устанавливать/снимать выделение с пункта, который у тебя во время нажатия активен (ActiveRect).

Хороший UI -- это такой UI, которым можно управлять без мышки. У тебя без мышки сделать мультиселект, увы, нельзя.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 07.06.2008 (Сб) 11:13

Во всех системах с множественным выбором должна быть коллекция SelectedItems и свойство ActiveItem.
Для коллекции нужен еще один класс. Не хотелось.

Как это сделано в Explorer-е (а точнее в ListView), идеально повторить в TreeView не получится - FocusRect жестко связан с SelectedItem. Либо нужно вообще отключать родной фокус/селект и делать полностью свой. Возможно когда-нибудь, но не сейчас.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 07.06.2008 (Сб) 12:36

Архив обновлен, исправлены пп. 4, 5, 6 и частично 7. IDE будет падать если закрывать форму из такбара правой кнопкой. Еще заработала подсветка при тягании, правда с небольшими артефактами.

Пункт 1 исправить пока не представляется возможным - тривью рисует синий фон и focusrect даже когда SelectedItem = Nothing. Если кто-нибудь в курсе как перехватить эту отрисовку - ну вы сам знаете...
Лучший способ понять что-то самому — объяснить это другому.


Вернуться в Кирпичный завод

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList