PaulMayer Ответов: 3

Treeview (C#) из рекурсивной таблицы


Я ищу, чтобы получить все комп-коды, связанные с кодом prod '500'
В таблице будет 1 продукт и коды comp для этого продукта. Сами коды comp будут иметь код prod в таблице, и этот код prod вполне может иметь коды comp, связанные с ним в таблице. Это и есть йеррахи. Я смотрю на CTE, который может пройти через таблицу и разработать уровни/подуровни, продукты и компоненты.

Что я уже пробовал:

Как я могу создать treeview, чтобы отразить уровни узлов, и как это сделать с помощью sql CTE?

Любая идея была бы великолепна спасибо

Maciej Los

Что вы пробовали? Где ты застрял?
Какой фреймворк: WinForms, WebControls, WPF,... ?

3 Ответов

Рейтинг:
28

Maciej Los

Пожалуйста, сначала прочтите мой комментарий к этому вопросу.

Что ж, документация MSDN полна примеров:
Как привязать TreeView для сведения, что есть неопределяемые глубина[^]
Пошаговое руководство: отображение иерархических данных в элементе управления TreeView[^]
Как использовать TreeView для отображения иерархических данных[^]

Пожалуйста, перейдите по ссылкам, чтобы узнать, как вставить узлы в TreeView из иерархических данных с помощью кода C#.

Что касается CTE... Вы можете использовать CTE (рекурсивный запрос) для определения уровня глубины узла, но ваши данные должны быть исправлены. Пожалуйста, изучите приведенный ниже пример:

DECLARE @tmp TABLE([prod code] NVARCHAR(255), [comp code] NVARCHAR(255))

INSERT INTO @tmp ([prod code], [comp code])
VALUES('Root', NULL),
('Root', '21223'),
('21223', 'part1'),
('21223', 'part2'),
('part2', 'subpart'),
('part2', 'subpart2'),
('subpart', 'lowerlevel')


;WITH CTE AS
(
	SELECT 1 AS NodeLevel, [prod code] AS NodeName
	FROM @tmp
	WHERE [comp code] IS NULL 
	UNION ALL
	SELECT t1.NodeLevel + 1 AS NodeLevel, t2.[comp code] AS NodeName
	FROM CTE AS t1 INNER JOIN @tmp AS t2 ON t1.NodeName = t2.[prod code] 
	WHERE t2.[comp code] IS NOT NULL

)
SELECT *
FROM CTE 

Результат:
NodeLevel	NodeName
1			Root
2			21223
3			part1
3			part2
4			subpart
4			subpart2
5			lowerlevel


Для получения дополнительной информации о CTE, пожалуйста, смотрите:
Рекурсивные Запросы, Использующие Обобщенные Табличные Выражения[^]
SQL SERVER-введение в иерархический запрос с использованием рекурсивного CTE-A Primer - Journey to SQL Authority with Pinal Dave[^]
Рекурсивный запрос CTE для иерархии данных(родительская дочерняя иерархия)[^]
Стратегия Depth First с иерархическими данными с использованием CTE ( Common Table Expression) - SQL Server | The SQL Ideas[^]

Попробуй!


phil.o

Хороший Мачей :) Имейте мои 5, Ваш ответ гораздо более подробный, чем мой.

Maciej Los

Спасибо, Фил.

BillWoodruff

+5

Maciej Los

- Спасибо, Билл.

Рейтинг:
2

phil.o

Техническое прилагательное для того, что вы ищете, - "иерархический".
Вот базовый поиск, предоставляющий достаточно ссылок, чтобы иметь подсказки об этом:
C# иерархическое древовидное представление[^]

Удачи вам и продолжайте в том же духе :)


Maciej Los

5ед!

PaulMayer

Спасибо Мацей

Это похоже на то, что я хотел, но я попробую утром. Большое спасибо за это

PaulMayer

Привет Мацей

Ваше решение было близко, но CTE нужно каким-то образом рекурсивно запросить себя, чтобы найти компоненты, которые сами являются продуктами в таблице. В одной таблице есть продукты с компонентами, и эти компоненты вполне могут быть перечислены в таблице как продукт с компонентами - и это иерархия. Может быть много уровней/подуровней для продукта. Есть идеи?

Рейтинг:
10

PaulMayer

В конце концов, я сделал рекурсивную функцию в C#, чтобы создать treeview. Я не мог найти способ добиться этого в SQL. Процесс, который я придумал, состоял в том, чтобы создать список хранения и класс, который имел объект List<string>, Level и TreeNode. Зная, что компонент существует в таблице как продукт, я бы создал другой узел и удалил продукт из списка.

Таким образом, в результате я получил список, который содержит объект со своим собственным списком. Для дерева продуктов 900+ обработка заняла 10 секунд. Может быть, есть более аккуратный способ, но для меня это сойдет.