События узла дерева ALV не запускаются

У меня возникает проблема, когда я использую ALV Tree без включенного выбора элементов. В этом случае я не могу получить событие для запроса контекстного меню узла. Когда я включаю выбор элементов, все работает нормально. Я получаю события для запроса контекстного меню для узлов, а также для элементов, но мне не нужно, чтобы выбор элемента был включен для моего приложения.

Вот код, которым я могу поделиться:

DATA: g_tree TYPE REF TO cl_gui_alv_tree.
* create container for alv-tree
DATA: l_tree_container_name(30) TYPE c,
      l_custom_container        TYPE REF TO cl_gui_custom_container.

l_tree_container_name = 'TREE'.

CREATE OBJECT l_custom_container
 EXPORTING
  container_name              = l_tree_container_name.

* create tree control
CREATE OBJECT g_tree
 EXPORTING
  parent                      = l_custom_container
  node_selection_mode         = cl_gui_column_tree=>node_sel_mode_single
  item_selection              = abap_true "WOULD LIKE TO HAVE THIS SET TO FALSE
  no_html_header              = abap_true
  no_toolbar                  = ''.

И здесь я регистрирую события:

DATA: lt_events TYPE cntl_simple_events,
      l_event   TYPE cntl_simple_event.

l_event-eventid = cl_gui_column_tree=>eventid_node_context_menu_req.
APPEND l_event TO lt_events.
l_event-eventid = cl_gui_column_tree=>eventid_item_context_menu_req.
APPEND l_event TO lt_events.

CALL METHOD g_tree->set_registered_events
  EXPORTING
    events                    = lt_events
  EXCEPTIONS
    cntl_error                = 1
    cntl_system_error         = 2
    illegal_event_combination = 3.

DATA: l_event_receiver TYPE REF TO tree_event_receiver.
CREATE OBJECT l_event_receiver.

 SET HANDLER l_event_receiver->handle_node_ctmenu_request FOR g_tree.
 SET HANDLER l_event_receiver->handle_node_ctmenu_selected FOR g_tree.
 SET HANDLER l_event_receiver->handle_item_ctmenu_request FOR g_tree.
 SET HANDLER l_event_receiver->handle_item_ctmenu_selected FOR g_tree.

И вот мои обработчики:

METHOD handle_node_ctmenu_request.
  CALL METHOD menu->add_function
      EXPORTING
        fcode = 'DELETE_ITEM'
        text  = 'delete'.
ENDMETHOD.
METHOD handle_item_ctmenu_request.
CALL METHOD menu->add_function
      EXPORTING
        fcode = 'DELETE_ITEM'
        text  = 'delete'.
ENDMETHOD.

Таким образом, оба метода работают, когда для item_selection установлено значение true. Ни один из них не работает, когда для item_selection установлено значение false. Однако я ожидал, что в этом случае handle_node_ctmenu_request будет уволен.


person Stephan    schedule 24.02.2016    source источник


Ответы (1)


Хитрость заключается во взаимосвязи различных типов событий в модели дерева ALV.
Официальная платформа управления SAP документация гласит:

Если вы установили параметр item_selection = 'X' при создании экземпляра, вы также можете реагировать на следующие события:
...
ITEM_CONTEXT_MENU_REQUEST
ITEM_CONTEXT_MENU_SELECT
...

Но, к сожалению, в нем не указано (это подразумевается, как и многое другое в мире SAP), что Control Framework обрабатывает события элемента и узла в пуле.
Итак, если вы регистрируете связанные с элементом события с отключенным параметром item_selection, события, связанные с узлом, также не будут работать.
Другими словами, не регистрируйте события, связанные с элементом, если вы хотите добиться реакции на события, связанные с узлом, или установить для этого параметра значение «Включено».

person Suncatcher    schedule 05.04.2016