its_andrusha написал:
Да, смотрел в анализе производительности - 90% времени отрисовка дерева...
Можно увидеть ваш код создания дерева, добавления узла?
В создании ничего волшебного (скрытие лишних столбцов и установку обработчиков событий опустил)
Code:
cl_salv_tree=>FACTORY(
exporting
R_CONTAINER = cont2 " Abstract Container for GUI Controls
HIDE_HEADER = abap_true " Do Not Show Header
importing
R_SALV_TREE = SALV_TREE_FIAS " ALV: Tree Model
changing
T_TABLE = SALV_TREE_FIAS_DATA
).
Потом делаю первый уровень дерева
Code:
METHOD BUILD_ADDRESS_TREE.
SELECT *
INTO TABLE @DATA(lt)
FROM zfiasaddrobj
WHERE aolevel = 1
AND actstatus = 1
AND regioncode in @me->r_regio
order by offname.
DATA(nodes) = me->SALV_TREE_FIAS->GET_NODES( ).
DATA tree_row LIKE LINE OF me->salv_tree_fias_data.
LOOP AT lt ASSIGNING FIELD-SYMBOL(<fs>).
CLEAR tree_row.
MOVE-CORRESPONDING <fs> TO tree_row.
DATA(node) = nodes->ADD_NODE(
RELATED_NODE = ''
RELATIONSHIP = cl_gui_column_tree=>relat_last_child
DATA_ROW = tree_row
EXPANDER = abap_true
FOLDER = abap_true
).
ENDLOOP.
ENDMETHOD.
Потом при разворачивании добавляю узлы
Code:
METHOD ON_EXPAND_EMPTY_FOLDER.
DATA(node) = me->SALV_TREE_FIAS->GET_NODES( )->GET_NODE( NODE_KEY ).
TRY.
node->GET_FIRST_CHILD( ).
return.
CATCH cx_salv_msg.
ENDTRY.
FIELD-SYMBOLS <table> TYPE STANDARD TABLE.
DATA(data_row) = node->GET_DATA_ROW( ).
ASSIGN data_row->* TO FIELD-SYMBOL(<data_row>).
CHECK sy-subrc = 0.
ASSIGN COMPONENT 'AOGUID' OF STRUCTURE <data_row> TO FIELD-SYMBOL(<field>).
CHECK <field> IS ASSIGNED.
DATA t_addrobj TYPE STANDARD TABLE OF zfiasaddrobj.
t_addrobj = FILTER #( me->T_ADDROBJ_CITIES USING KEY key2 WHERE parentguid = <field> ).
DATA(t_addrobj2) = FILTER #( me->T_ADDROBJ_STREETS USING KEY key2 WHERE parentguid = <field> ).
APPEND LINES OF t_addrobj2 TO t_addrobj.
sort t_addrobj by offname.
ASSIGN t_addrobj TO <table>.
IF sy-subrc <> 0 or lines( t_addrobj ) = 0.
DATA t_house TYPE STANDARD TABLE OF zfiashouse.
t_house = FILTER #( me->T_HOUSES USING KEY key1 WHERE aoguid = <field> ).
sort t_house by housenum buildnum strucnum.
ASSIGN t_house TO <table>.
ENDIF.
IF <table> IS NOT ASSIGNED or lines( <table> ) = 0.
node->SET_EXPANDER( abap_false ).
RETURN.
ELSE.
DATA(nodes) = me->SALV_TREE_FIAS->GET_NODES( ).
DATA ls like LINE OF me->SALV_TREE_FIAS_DATA.
LOOP AT <table> ASSIGNING FIELD-SYMBOL(<line>).
CLEAR ls.
MOVE-CORRESPONDING <line> TO ls.
IF ls-OFFNAME = space.
ASSIGN COMPONENT 'FORMALNAME' OF STRUCTURE <line> TO <field>.
IF sy-subrc = 0.
ls-offname = <field>.
ENDIF.
ENDIF.
node = nodes->ADD_NODE(
RELATED_NODE = node_key
RELATIONSHIP = cl_gui_column_tree=>relat_last_child
DATA_ROW = ls
EXPANDER = xsdbool( ls-houseguid = space )
FOLDER = xsdbool( ls-houseguid = space )
).
ENDLOOP.
ENDIF.
ENDMETHOD.