Как построить свое дерево объектов на интерфейсе wf
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Как построить свое дерево объектов на интерфейсе wf
Всем привет - кто нибудь делал такое?
(не знаю может сейчас это уже в базовом функционале)
короче нужно просто - слева дерево с узлами справа список и чекбокс использовать дочерние или нет + фильтр на все про все
(не знаю может сейчас это уже в базовом функционале)
короче нужно просто - слева дерево с узлами справа список и чекбокс использовать дочерние или нет + фильтр на все про все
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как построить свое дерево объектов на интерфейсе wf
можно слева строковый массив запустить с рекурсивным запросом и отступами (формата: id_объекта, id_родителя, наименование_объекта)
справа запрос на дочерние элементы левого списка (1го уровня или всех) (формата: id_родителя, составное наименование_объекта)
обновлять правый список при переходе к другой строке в левом...
с этим нет вопросов
...
а вот как сделать чтобы слева узел можно было закрыть раскрыть... красиво?
типа слева добавить колонку с чекбоксами - но непонятно как модифицировать основной запрос для дерева
вот этот запрос для примера (MSSQL2005) (это текст для 1С))), есть такой же для Лоции - у меня просто идет интеграция разных БД (на платформе Лоции) для работы с прайсами)
справа запрос на дочерние элементы левого списка (1го уровня или всех) (формата: id_родителя, составное наименование_объекта)
обновлять правый список при переходе к другой строке в левом...
с этим нет вопросов
...
а вот как сделать чтобы слева узел можно было закрыть раскрыть... красиво?
типа слева добавить колонку с чекбоксами - но непонятно как модифицировать основной запрос для дерева
вот этот запрос для примера (MSSQL2005) (это текст для 1С))), есть такой же для Лоции - у меня просто идет интеграция разных БД (на платформе Лоции) для работы с прайсами)
Код: Выделить всё
WITH Rec (id, pid, title,level, list)
AS (
SELECT tb1._IDRRef as id,
tb1._ParentIDRRef as pid,
tb1._Description as title,
0,
cast(tb1._Description as nvarchar(max))
FROM dbo._Reference79 as tb1
where tb1._Folder = 0
and
tb1._ParentIDRRef=0 -- id корневого родителя
UNION ALL
SELECT tb2._IDRRef as id,
tb2._ParentIDRRef as pid,
tb2._Description as title,
Rec.level+1,
cast(Rec.list + '/' + tb2._Description as nvarchar(max))
FROM dbo._Reference79 as tb2 inner join Rec
on Rec.id = tb2._ParentIDRRef and tb2._Folder = 0
)
SELECT id,
pid,
space( level *4) + title--,
--level, --уровень вложенности
--list --составное наименование для сортировки
FROM Rec
--where level<=2
ORDER BY list
--OPTION(MAXRECURSION 0);
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Новый участник
- Сообщения: 23
- Зарегистрирован: 19 сен 2011, 15:35
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Воронеж
Re: Как построить свое дерево объектов на интерфейсе wf
Мы в подобной ситуации не нашли решения лучше, чем полностью перерисовывать массив:
Т.е. по изменению значения переменной-чекбокса удаляем все элементы массива, у которых некоторое значение не подходит (в вашем случае - удалить элементы с опредёленным pid) , в случае развёртывания - запрашиваем из бд все объекты, у которых pid=заданному id и добавляем их в массив в соответствующее место и перерисовываем массив.
У нас, правда, это не кнопка разворачивания, а кнопка "показать аннулированные элементы", так что ей не особенно часто пользуются.
PS: Пробовали играть с видимостью элементов и настройкой ширины строк - получается не красиво.
Т.е. по изменению значения переменной-чекбокса удаляем все элементы массива, у которых некоторое значение не подходит (в вашем случае - удалить элементы с опредёленным pid) , в случае развёртывания - запрашиваем из бд все объекты, у которых pid=заданному id и добавляем их в массив в соответствующее место и перерисовываем массив.
У нас, правда, это не кнопка разворачивания, а кнопка "показать аннулированные элементы", так что ей не особенно часто пользуются.
PS: Пробовали играть с видимостью элементов и настройкой ширины строк - получается не красиво.
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как построить свое дерево объектов на интерфейсе wf
os_cherepanova - сриншот не выложите дерева?... сюда - посмотреть как у вас получилось
ps
если кнопка узла идет отдельной колонкой, а дерево построено с отступами - вроде не красиво
а если кнопку узла двигать с отступами...
в общем пока не понятно
ps
если кнопка узла идет отдельной колонкой, а дерево построено с отступами - вроде не красиво
а если кнопку узла двигать с отступами...
в общем пока не понятно
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Новый участник
- Сообщения: 23
- Зарегистрирован: 19 сен 2011, 15:35
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Воронеж
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как построить свое дерево объектов на интерфейсе wf
спасиб - смотрю...
а у нас вот пока так получается глубину списка используем в сдвиге по левому краю (X)
иконки узла - переменная тип строка (использовать как рисунок) + событие на нажатие с изменением рисунка по xor
и наименование узла
но из за использовать как рисунок - массив этот еле шевелится на прокрукту хотя всего ~1000 строк
вот думаем на счет быстродействия - пока нет идей
ps
смотрели с чекбоксами и с кнопками - но напрягает что при нажатии на них 'перемигивается' вся колонка с чекбоксами/кнопками - некрасиво
а у нас вот пока так получается глубину списка используем в сдвиге по левому краю (X)
иконки узла - переменная тип строка (использовать как рисунок) + событие на нажатие с изменением рисунка по xor
и наименование узла
но из за использовать как рисунок - массив этот еле шевелится на прокрукту хотя всего ~1000 строк
вот думаем на счет быстродействия - пока нет идей
ps
смотрели с чекбоксами и с кнопками - но напрягает что при нажатии на них 'перемигивается' вся колонка с чекбоксами/кнопками - некрасиво
Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как построить свое дерево объектов на интерфейсе wf
вот в итоге пришли к текстовому изображению узла +/- подложили под него пустую текстовую рамку с тенью
все ок, не тормозитСофт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный
-
- Новый участник
- Сообщения: 23
- Зарегистрирован: 19 сен 2011, 15:35
- Используемое ПО: Lotsia PDM PLUS
- Откуда: Воронеж
Re: Как построить свое дерево объектов на интерфейсе wf
Александр, с отступами и плюсами получилось шикарно. Надо будет сдвиг взять на заметку.
- Александр
- Активный участник
- Сообщения: 1658
- Зарегистрирован: 24 авг 2006, 08:06
- Используемое ПО: Lotsia PDM PLUS
- Откуда: 55.745578,37.665825
Re: Как построить свое дерево объектов на интерфейсе wf
ну и сам код нажатия на иконку узла (чисто скрипты)) vbscript)
'+' добавить дочерние элементы первого уровня
'-' удалить все дочерние элементы узлаи чуть чуть Лоции для обновления данных на форме
эт массив содержащий 4 массива("tPriceLevel", "tPriceMode","tPriceId","tPriceName")
ps
ограничения (хотя вроде многие так и ограничивают, и скорость выше и кода меньше)
- состояния дочерних узлов при переоткрытии не запоминаются
- при открытии открываем только первый уровень
pps
вообще - круто получилось!

'+' добавить дочерние элементы первого уровня
'-' удалить все дочерние элементы узла
Код: Выделить всё
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
'событие на нажатие иконки узла дерева
'----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sub SelectActionsModePriceTree
Dim Count, tmp, Str, i, Node, sql
Dim a1, a2, a3, a4, arr, cSize, nSize, cLevel
Count = cInt(LsJob.GetVarValue(" CurrentLineFrmTreePrice ")) ' загрузить текущую строку массива
a1 = LsJob.GetVarValue("tPriceLevel")
cLevel = cInt(a1(Count-1))
a2 = LsJob.GetVarValue("tPriceMode")
a3 = LsJob.GetVarValue("tPriceId")
a4 = LsJob.GetVarValue("tPriceName")
cSize = UBound(a1)
Select Case cStr(a2(Count-1))
Case "+" ' добавить дочерние элементы первого уровня
a2(Count - 1) = "-" ' поставить отметку что текущий узел открыт
If DataBase.ADODB_Connected Then ' если подключиться удалось работаем иначе нет
If DataBase.ADODB_RecordSet Then ' если удалось создать recordset тоже работаем
sql = "select level as tPriceLevel, '+' as tPriceMode, master.dbo.fn_varbintohexstr(id) as tPriceId, Description as tPriceName from LSDBO.Ric_1C_Get_objChild(" & CStr(a3(Count - 1)) & ",0,0)"
If DataBase.OpenRecordSet(sql) Then ' прочитать данные из базы
arr = rs.GetRows ' рекордсет в массив
rs.Close
nSize = UBound(arr, 2)
cSize = (cSize + 1) + (nSize + 1) - 1
ReDim Preserve a1(cSize) ' изменить размерность массивов на новую группу дочерних элементов
ReDim Preserve a2(cSize) ' изменить размерность массивов на новую группу дочерних элементов
ReDim Preserve a3(cSize) ' изменить размерность массивов на новую группу дочерних элементов
ReDim Preserve a4(cSize) ' изменить размерность массивов на новую группу дочерних элементов
For i = 0 To cSize - nSize - Count - 1 ' переместить часть массива в конец начиная с текущей позиции+1
a1(cSize - i) = a1(cSize - nSize - 1 - i)
a2(cSize - i) = a2(cSize - nSize - 1 - i)
a3(cSize - i) = a3(cSize - nSize - 1 - i)
a4(cSize - i) = a4(cSize - nSize - 1 - i)
Next
For i = 0 To nSize ' заполнить дырку данными из запроса
a1(Count + i) = arr(0, i) + cLevel + 1
a2(Count + i) = arr(1, i)
a3(Count + i) = arr(2, i)
a4(Count + i) = arr(3, i)
Next
End If
Set rs = Nothing ' убъем рекордсет
Set cn = Nothing ' убить объект соединения с базой
End If
End if
Case "-" ' удалить дочерние элементы всех уровней
a2(Count - 1) = "+" ' поставить отметку что текущий узел закрыт
nSize=0
For i=Count to cSize ' подсчитать количество дочерних элементов
if a1(i)<=a1(Count-1) Then
Exit For
Else
nSize=nSize+1
End If
Next
If nSize>0 then ' если есть дочерние элементы - удалить их
cSize = cSize - nSize
For i = 0 To cSize - Count ' переместить часть массива из конца в начало с текущей позиции+1
a1(Count + i) = a1(Count + nSize + i)
a2(Count + i) = a2(Count + nSize + i)
a3(Count + i) = a3(Count + nSize + i)
a4(Count + i) = a4(Count + nSize + i)
Next
ReDim Preserve a1(cSize) ' изменить размерность массивов на новую группу дочерних элементов
ReDim Preserve a2(cSize) ' изменить размерность массивов на новую группу дочерних элементов
ReDim Preserve a3(cSize) ' изменить размерность массивов на новую группу дочерних элементов
ReDim Preserve a4(cSize) ' изменить размерность массивов на новую группу дочерних элементов
End If
End Select
LsJob.SetVarValue "tPriceLevel", a1
LsJob.SetVarValue "tPriceMode", a2
LsJob.SetVarValue "tPriceId", a3
LsJob.SetVarValue "tPriceName", a4
End Sub
Код: Выделить всё
f_FormArrayToData ( this , 'frmPriceTree')
ps
ограничения (хотя вроде многие так и ограничивают, и скорость выше и кода меньше)
- состояния дочерних узлов при переоткрытии не запоминаются
- при открытии открываем только первый уровень
pps
вообще - круто получилось!


Софт - RicCRM<<LotsiaPDM(4.40)<<MsSQL(5/8)
Уровень администрирования - Альтернативный