Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > Windows Forms
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2016, 22:53   #1
Cha1000000
Пользователь
 
Регистрация: 08.05.2014
Сообщений: 17
По умолчанию Поиск абсолютного индекса элемента в TreeView (C++/CLI Windows Forms)

Уважаемые коллеги! Помогите решить такую проблемку. Если объяснять коротко, то в Borland C++ Builder для элементов TreeView есть такое свойство AbsoluteIndex, который возвращает абсолютный индекс элемента в дереве TreeView, без учета вложенности уровней... Вот не могу никак найти аналогичное свойство в VC. Подскажите, пожалуйста, кто знает! Либо, если аналога и впрямь нет, то какой манипуляцией в VC можно этот АБСОЛЮТНЫЙ индекс получить?

А теперь опишу подробнее свой вопрос, основываясь на конкретной ситуации (если кому-то оказалось не совсем понятно, что я имею в виду из написанного выше).
Имеется дерево вида:

+Узел[0]
- элем1
- элем2
. . .
- элем8
+Узел[1]
- элем1
. . .
- элем6

В событии AfterSelect (выбираю элемент дерева щелчком мыши) если выбирая любой дочерний элемент, мне нужно получить его "порядковый номер" (абсолютный индекс). Пробовал воспользоваться свойством e->Node->Index; но так я получаю индексы дочерних элементов в каждом узле, начиная с нуля в каждом узле. Т.е. когда я выбираю, допустим, элемент1 Узла[1], я получаю индекс 0, а мне нужно, чтоб он был 9, соответственно для, например, элемента 3 Узла[1] он должен быть не 2, а 11. Т.е. в порядке начиная от (Узел[0],элем1) = 0 до (Узел[1],элем6) = 14.
Подскажите, кто знает, как можно получить такую индексацию! Заранее спасибо!
Cha1000000 вне форума Ответить с цитированием
Старый 11.04.2016, 09:42   #2
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Ну всегда можно просто идти в цикле и считать элементы пока не дойдет до нужного. Или в Tag записать индекс.
Код:
            int count = 0;
            foreach (TreeNode rootNode in treeView.Nodes)
            {
                foreach (TreeNode node in rootNode.Nodes)
                {
                    node.Tag = count++;
                }
            }
А для чего он нужен?
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.04.2016, 13:40   #3
Cha1000000
Пользователь
 
Регистрация: 08.05.2014
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Ну всегда можно просто идти в цикле и считать элементы пока не дойдет до нужного. Или в Tag записать индекс.
Код:
            int count = 0;
            foreach (TreeNode rootNode in treeView.Nodes)
            {
                foreach (TreeNode node in rootNode.Nodes)
                {
                    node.Tag = count++;
                }
            }
А для чего он нужен?
За подсказку с циклом спасибо, попробую так. Но с циклом foreach еще не работал прежде (только с for и while), вот и будет повод потренироваться и расширить кругозор))

По поводу "для чего нужно". Чтоб было еще понятнее, действительно, пожалуй опишу подробнее всю суть чего я в результате хочу добиться. А может кто вообще другой подход для решения посоветует, а не такой как я выбрал...
В общем, в моей программе в левой половине окна находится дерево устройств, подключенных к ПК по интерфейсу USB. Главных узла (как бы категории устройств) у меня два: USB устройства (TreeView1->Nodes[0]) и HID устройства (TreeView1->Nodes[1]). Получается, как я уже писал выше, у первого узла индекс 0, у второго 1 (но индексы самих узлов меня не интересуют), а вот их дочерние элементы (их индексы) у каждого узла начинаются с нуля. А в правой части окна программы есть ComboBox, в котором продублированы все эти же устройства (только дочерние элементы узлов, названия узлов в список не входит) сплошным списком, но в таком же порядке, как и в Дереве.
Вот мне и нужно собственно, что бы когда я выбираю какой-либо элемент в дереве, то соответствующий ему в комбобоксе активировался в нем автоматически.
Для этого я и хотел по индексу их сравнивать... Вот только в комбобоксе индексы записей идут сплошняком от 0 до N. А в дереве индексация разбита на две группы (каждая начинается с нуля). В Билдере эта задача чудесным образом решалась так:
Код:
int n = TreeView1->Selected->AbsoluteIndex;
и без всяких циклов в n бы попадал при выборе любого элемента дерева его абсолютный индекс, который бы и соответствовал нужному индексу элементов в комбобоксе. В студии же я такого к сожалению не нашел(((
Если у кого будут какие-то альтернативные подходы к решению задачи, буду рад послушать и обсудить.

P.S. Попробовал ваш вариант с циклом, но он ведь считает лишь общее кол-во дочерних узлов. А мне нужно при щелчке по одному любому узлу, получать его индекс.

Последний раз редактировалось Cha1000000; 11.04.2016 в 14:03.
Cha1000000 вне форума Ответить с цитированием
Старый 11.04.2016, 13:52   #4
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Кстати, а почему вдруг понадобилось переписывать с Билдера на .NET, да еще и на С++? (если .NET, то обычно намного проще взять C#, а на C++/CLI мало кто пишет, только для каких-нибудь специфичных задач по связыванию .NET сборок и нативного кода может быть смысл его брать)

Цитата:
P.S. Попробовал ваш вариант с циклом, но он ведь считает лишь общее кол-во дочерних узлов. А мне нужно при щелчке по одному любому узлу, получать его индекс.
Так надо либо останавливаться при нахождении узла, либо после заполнения TreeView записать в .Tag как в коде выше, а потом доставать из .Tag.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.

Последний раз редактировалось Alex11223; 11.04.2016 в 14:39.
Alex11223 вне форума Ответить с цитированием
Старый 11.04.2016, 14:38   #5
Cha1000000
Пользователь
 
Регистрация: 08.05.2014
Сообщений: 17
Радость

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Кстати, а почему вдруг понадобилось переписывать с Билдера на .NET, да еще и на С++? (если .NET, то обычно намного проще взять C#, а на C++/CLI мало кто пишет, только для каких-нибудь специфичных задач по связыванию .NET сборок и нативного кода может быть смысл его брать)
Нет, я на самом деле не переписываю программу с билдеровской версии, я просто раньше больше работал в билдере и к нему уже как-то более привык. Просто программу я уже начал изначально делать в десятой студии (потом продолжил в 13й из-за большего удобства в редакторе, но не суть...). К специфическим особенностям и синтаксису студии я еще не особо приловчился, но делать прогу из личного энтузиазма захотел в более новой (современной) среде, нежели билдер 5, 6... Да и в новом Embarcalero билдере начинать создавать этот проект тоже что-то душа не легла)) Т.е. принципиальной разницы нет на самом деле в какой среде мне эту прогу клепать, дело просто в лично энтузиазме и плюс, пока начал в студии проект и более-менее начал к ней привыкать, в некоторых моментах стали её особенности больше уже нравится (в плане удобства и т.п.), чем в билдерах...
Ну, если с формальностями ("для чего и почему") разобрались, то хотелось бы вернуться к сути вопроса.

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Так надо либо останавливаться при нахождении узла, либо после заполнения TreeView записать в .Tag как в коде выше, а потом доставать из .Tag.
А можно с этого места по подробнее?
Что-то пока не соображу как остановиться при нахождении выбранного узла? Вернее как это правильно записать...

Последний раз редактировалось Alex11223; 11.04.2016 в 15:32.
Cha1000000 вне форума Ответить с цитированием
Старый 11.04.2016, 14:53   #6
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Это не "студии" синтаксис, а .NET. По сути это не С++, а отдельный язык (на котором очень мало кто пишет, ибо для .NET есть C#, который проще и удобнее) похожий на С++, предназначенный для .NET.
Обычно все пишут либо на чистом С++ с С++ библиотеками (в т.ч. в студии, я например Qt использую в студии ), либо если .NET, то на C#.

Цитата:
Что-то пока не соображу как остановиться при нахождении выбранного узла?
Может быть значение FullPath проверять.

Я б лучше вариант с Tag использовал.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.04.2016, 15:08   #7
Cha1000000
Пользователь
 
Регистрация: 08.05.2014
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Это не "студии" синтаксис, а .NET. По сути это не С++, а отдельный язык (на котором очень мало кто пишет, ибо для .NET есть C#, который проще и удобнее) похожий на С++, предназначенный для .NET.
Обычно все пишут либо на чистом С++ с С++ библиотеками (в т.ч. в студии, я например Qt использую в студии ), либо если .NET, то на C#.


Может быть значение FullPath проверять.

Я б лучше вариант с Tag использовал.
Нет, проверять FullPath мне тоже идея не нравится. А вот попробовал сделать так:
Код:
int count = 0;
for each(rootNode in DevTree->Nodes)
{
	for each( node in rootNode->Nodes)
        {
		if (node->IsSelected)
			break;
		node->Tag = count++;
	}
}
И наблюдаю такой интересный результат: индексы элементов второй "группы" выводятся вроде от нужного мне начального индекса, а вот у первой почему-то не с нуля начинается, а с 5. По какой такой логике пока не понял...
Cha1000000 вне форума Ответить с цитированием
Старый 11.04.2016, 15:10   #8
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Вы только из второго (вложенного) цикла выходите.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 11.04.2016, 15:27   #9
Cha1000000
Пользователь
 
Регистрация: 08.05.2014
Сообщений: 17
По умолчанию

Цитата:
Сообщение от Alex11223 Посмотреть сообщение
Вы только из второго (вложенного) цикла выходите.
Ой точно! Поторопился)) Действительно записал так:
Код:
			 int count = 0;
			 for each(rootNode in DevTree->Nodes)
			 {
				 for each( node in rootNode->Nodes)
				 {
					 if (node->IsSelected)
						 break;
					 node->Tag = count++;
				 }
				 if (node->IsSelected)
					 break;
			 }
Прокатило! Выводит номера как нужно! Огромное спасибо!

А по поводу выбора среды разработки, тоже спасибо за советы по применению. Я уже и сам начал убеждаться, что для .NET C# удобнее и чтоб меньше голову ломать можно и на старом добром билдере оконные приложения клепать) Просто тут уже начал и неохота уже переделывать под другой средой или платформой, тем более, что сроки жмут, а мне тут еще функционал по обмену данными с выбранным из списка устройством надо разобраться как запилить.
Задумка такая: хочу подключить, например, геймпад, выбрать его в списке HID устройств, а дальше мне надо будет как-то и куда-то (наверное просто в TextBox запилю) считывать пакетные данные из устройства и передавать в устройство пакеты... Ну это, как говорится, уже другая история. С этим я только собираюсь начать сегодня разбираться...
Cha1000000 вне форума Ответить с цитированием
Старый 11.04.2016, 15:30   #10
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Зачем вы в Tag присваиваете если не используете? Про Tag имелось в виду так:

при заполнении
Код:
            int count = 0;
            foreach (TreeNode rootNode in treeView.Nodes)
            {
                foreach (TreeNode node in rootNode.Nodes)
                {
                    node.Tag = count++;
                }
            }
в AfterSelect и т.п.
Код:
int absIndex = (int) node.Tag;
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++/CLI Windows Forms Обработка сообщения WM_DEVICECHANGE Cha1000000 Windows Forms 13 08.04.2016 00:52
Поиск индекса максимального элемента массива alexchromets Общие вопросы по Java, Java SE, Kotlin 2 06.03.2013 23:02
DirectInput и джойстик (C++/CLI, Windows Forms) Vistaern Win Api 1 21.02.2013 06:48
Проблема с выделением памяти в глобальной области windows forms(C++\CLI) DartLenin Помощь студентам 2 24.01.2012 20:58
Проблема с отображением русского языка (Windows Forms C++ CLI) Alex TGM Помощь студентам 0 17.08.2010 11:13