Динамическая настраиваемая панель инструментов - PullRequest
0 голосов
/ 17 сентября 2018

Я пытаюсь динамически построить панель инструментов в зависимости от заданных критериев благодаря событию "панель инструментов" в классе cl_gui_alv_grid.

Проблема в том, что панель инструментов получает мою пользовательскую кнопку, но как только мои критерии больше не соответствуют и я хочу удалить одну кнопку, панель инструментов не обновляется. Пример здесь ниже

"Refresh button


CLEAR ls_toolbar.
  ls_toolbar-icon        = icon_refresh.
  ls_toolbar-quickinfo   = TEXT-ref.
  ls_toolbar-butn_type   = 0.
  ls_toolbar-text        = TEXT-ref.
  ls_toolbar-function    = 'REFRESH'.
  ls_toolbar-disabled    = abap_false.
  APPEND ls_toolbar      TO e_object->mt_toolbar.

  "Save button
  IF my_criteria is false.
    DELETE e_object->mt_toolbar WHERE function EQ 'SAVE'.
  ELSE.
    CLEAR ls_toolbar.
    ls_toolbar-icon        = icon_system_save.
    ls_toolbar-quickinfo   = TEXT-sav.
    ls_toolbar-butn_type   = 0.
    ls_toolbar-text        = TEXT-sav.
    ls_toolbar-function    = 'LAMA_SAVE'.
    ls_toolbar-disabled    = abap_false.
    APPEND ls_toolbar      TO e_object->mt_toolbar.

  ENDIF.

Когда я создаю свой ALV, я вызываю метод lo_alv-> set_toolbar_interactive ().

Когда я вхожу в режим отладки, я вижу, что кнопка сохранения добавляется или удаляется, но она не отражается на экране после однократного отображения панели инструментов.

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

Я могу достичь той функциональности, которую вы ищете, но не ясно, каков ваш точный поток, может быть несколько причин этой проблемы.Итак, вот небольшая демонстрация того, как вы должны это сделать (программа отображает одну кнопку на панели инструментов, вы нажимаете ее, и она исчезает, остальная часть ALV остается неизменной).

REPORT zdemo.
CLASS lcl_app DEFINITION.
  PUBLIC SECTION.
    CLASS-METHODS pbo.
    CLASS-METHODS on_user_command FOR EVENT user_command OF cl_gui_alv_grid
            IMPORTING sender e_ucomm.
    CLASS-METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
            IMPORTING e_object e_interactive.
    CLASS-DATA alv_grid TYPE REF TO cl_gui_alv_grid.
    CLASS-DATA flights TYPE TABLE OF sflight.
ENDCLASS.

CLASS lcl_app IMPLEMENTATION.
  METHOD pbo.
    DATA: it_layout  TYPE lvc_s_layo,
          it_fcat    TYPE lvc_t_fcat,
          ls_exclude TYPE ui_func,
          gs_variant TYPE disvariant,
          lt_exclude TYPE ui_functions.

    IF alv_grid IS NOT BOUND.
      SELECT * FROM sflight INTO TABLE flights.

      ls_exclude = cl_gui_alv_grid=>mc_fc_excl_all.
      APPEND ls_exclude TO lt_exclude.

      CALL FUNCTION 'LVC_FIELDCATALOG_MERGE'
        EXPORTING i_structure_name = 'SFLIGHT'
        CHANGING ct_fieldcat = it_fcat
        EXCEPTIONS OTHERS = 3.
      CHECK sy-subrc = 0.

      CREATE OBJECT alv_grid
        EXPORTING
          i_parent = cl_gui_container=>screen0.

      SET HANDLER handle_toolbar FOR alv_grid.
      SET HANDLER on_user_command FOR alv_grid.
      CALL METHOD alv_grid->set_table_for_first_display
        EXPORTING
          is_layout            = it_layout
          it_toolbar_excluding = lt_exclude
          is_variant           = gs_variant
        CHANGING
          it_outtab            = flights
          it_fieldcatalog      = it_fcat
        EXCEPTIONS
          OTHERS               = 4.
    ENDIF.
  ENDMETHOD.

  METHOD handle_toolbar.
    DATA ls_toolbar TYPE stb_button.
    IF e_interactive = abap_false.
      " Added the first time only
      ls_toolbar-function  = 'DEMO'.
      ls_toolbar-text      = 'Click me and I will disappear'.
      APPEND ls_toolbar TO e_object->mt_toolbar.
    ENDIF.
  ENDMETHOD.

  METHOD on_user_command.
    IF e_ucomm = 'DEMO'.
      sender->set_toolbar_interactive( ).
    ENDIF.
  ENDMETHOD.
ENDCLASS.

PARAMETERS dummy.

AT SELECTION-SCREEN OUTPUT.
  lcl_app=>pbo( ).
0 голосов
/ 19 сентября 2018

Сандра Росси права. Было два разных экземпляра ALVG, и он не справлялся с обработчиком, поэтому панель инструментов не обновлялась правильно.

Спасибо всем,

0 голосов
/ 17 сентября 2018

Если я не ошибаюсь, обновление сетки ALV не перестраивает панель инструментов .

Я думаю, что вам нужно повторно инициализировать сетку ALV с помощью SET_TABLE_FOR_FIRST_DISPLAY, чтобы иметь дополнительную функциональность панели инструментов.

...