Захват расширения узла события (ABAP)
Я создал alv tree view с использованием класса *cl_salv_tree*. Все работает нормально, но я хотел бы захватить событие, когда узел расширяется, для заполнения функции, которая автоматически изменяет размеры столбцов дерева. Моя проблема в том, что событие расширения является закрытым методом *HANDLE_EXPAND_NC* класса *CL_GUI_ALV_TREE*, и я на самом деле не знаю, как захватить это событие. Я открыт для любых идей и спасибо за ваше время.
С уважением
Себастьян
1 ответ
Вот минимальный воспроизводимый пример, который показывает, что событие EXPAND_EMPTY_FOLDER
запускается, когда вы раскрываете узел, у которого изначально нет дочерних узлов, дочерний узел добавляется во время этого события:
CLASS lcl_app DEFINITION.
PUBLIC SECTION.
METHODS pbo
RAISING
cx_salv_error.
PRIVATE SECTION.
DATA: salv TYPE REF TO cl_salv_tree,
scarrs TYPE STANDARD TABLE OF scarr.
METHODS on_expand_empty_folder
FOR EVENT expand_empty_folder
OF cl_salv_events_tree
IMPORTING node_key.
ENDCLASS.
CLASS lcl_app IMPLEMENTATION.
METHOD pbo.
IF salv IS NOT BOUND.
cl_salv_tree=>factory( EXPORTING r_container = cl_gui_container=>screen0
IMPORTING r_salv_tree = salv
CHANGING t_table = scarrs ).
DATA(lo_settings) = salv->get_tree_settings( ).
lo_settings->set_hierarchy_size( 30 ).
DATA(event) = salv->get_event( ).
salv->get_functions( )->add_function( name = 'NEW' text = 'NEW' tooltip = '' position = 1 ).
SET HANDLER on_expand_empty_folder FOR event.
SELECT * FROM scarr INTO TABLE @DATA(local_scarrs).
LOOP AT local_scarrs REFERENCE INTO DATA(scarr).
salv->get_nodes( )->add_node(
related_node = space " (root node)
relationship = cl_gui_column_tree=>relat_last_child
text = |{ scarr->carrid } - { scarr->carrname }|
data_row = scarr->*
folder = abap_true
expander = abap_true ).
ENDLOOP.
salv->display( ).
ENDIF.
LOOP AT SCREEN.
screen-active = '0'.
MODIFY SCREEN.
ENDLOOP.
ENDMETHOD.
METHOD on_expand_empty_folder.
TRY.
DATA(scarr) = CAST scarr( salv->get_nodes( )->get_node( node_key )->get_data_row( ) )->*.
salv->get_nodes( )->add_node(
related_node = node_key
relationship = cl_gui_column_tree=>relat_last_child
text = |Node added at time of expand below { scarr-carrid }| ).
CATCH cx_root INTO DATA(lx).
MESSAGE lx TYPE 'I' DISPLAY LIKE 'E'.
LEAVE PROGRAM.
ENDTRY.
ENDMETHOD.
ENDCLASS.
PARAMETERS dummy.
LOAD-OF-PROGRAM.
DATA(app) = NEW lcl_app( ).
AT SELECTION-SCREEN OUTPUT.
TRY.
app->pbo( ).
CATCH cx_root INTO DATA(lx).
MESSAGE lx TYPE 'S' DISPLAY LIKE 'E'.
ENDTRY.
Насколько я знаю, вы можете получать уведомления только в том случае, если папка развернута и еще не содержит дочерних элементов (_NC
часть имени метода / события означает, что). Это предназначено для ленивой загрузки дерева. Дерево, отображаемое в меню SAP или IMG, является хорошим примером для этого - вы можете увидеть части загружаемого дерева, когда развернете узлы верхнего уровня.
Если вам этого достаточно, используйте событие EXPAND_EMPTY_FOLDER
интерфейса IF_SALV_EVENTS_TREE
, реализованный CL_SALV_EVENTS_TREE
, Хотя, похоже, для этого не существует хорошей демонстрационной программы.