Захват события расширения узла в дереве ALV (ABAP)

Я создал древовидное представление ALV с использованием класса CL_SALV_TREE.

Все работает нормально, но я хотел бы захватить событие, когда узел расширяется, для заполнения функции, которая автоматически изменяет размеры столбцов дерева.

Моя проблема в том, что расширяющееся событие — это закрытый метод HANDLE_EXPAND_NC класса CL_GUI_ALV_TREE, и я на самом деле не знаю, как захватить это событие. Я открыт для любых идей и спасибо за ваше время.


person Sebastian    schedule 20.03.2014    source источник


Ответы (2)


Насколько мне известно, вы можете получать уведомления только в том случае, если расширяется папка, которая еще не содержит дочерних элементов (часть _NC имени метода/события означает это). Это предназначено для ленивой загрузки дерева. Дерево, отображаемое в меню SAP или IMG, является хорошим примером для этого — вы можете увидеть, как загружаются части дерева, когда вы разворачиваете узлы верхнего уровня.

Если вам этого достаточно, используйте событие EXPAND_EMPTY_FOLDER интерфейса IF_SALV_EVENTS_TREE, реализованного CL_SALV_EVENTS_TREE. Однако для этого не существует хорошей демонстрационной программы.

person vwegert    schedule 20.03.2014
comment
Я на самом деле не понимаю вашу идею за этим. Я хочу изменить размер столбцов только после расширения узла моего дерева. Я не знаю, какое отношение к этому имеет событие EXPAND_EMPTY_FOLDER, потому что, если я расширяю узел, появляется больше папок. Если у вас есть идея, как использовать это для моего случая, пожалуйста, скажите мне :) и спасибо за ваш ответ - person Sebastian; 20.03.2014
comment
Пожалуйста, перечитайте первое предложение моего ответа. Насколько я знаю, не существует события, которое запускается, если расширяется какой-либо узел. - person vwegert; 20.03.2014
comment
извините, я думал, что у вас есть идея, как обойти событие EXPAND_EMPTY_FOLDER, чтобы получить решение - person Sebastian; 20.03.2014

Вот минимальный воспроизводимый пример, который показывает, что событие 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.
person Sandra Rossi    schedule 10.11.2019