动态自定义工具栏

时间:2018-09-17 15:34:18

标签: abap alv

由于类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()。

当我进入调试模式时,我看到添加或删除了保存按钮,但是一旦工具栏一次显示出来,它就不会显示在屏幕上。

4 个答案:

答案 0 :(得分:0)

我可以实现您正在寻找的功能,但是尚不清楚您的确切流程是什么,这可能有多个原因。因此,这是一个简短的演示示例(程序在工具栏中显示一个按钮,单击该按钮,它会消失,其余的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( ).

答案 1 :(得分:0)

桑德拉·罗西(Sandra Rosssi)是对的。 ALVG有两个不同的实例,并且处理程序很混乱,这就是为什么工具栏无法正确刷新的原因。

谢谢,

答案 2 :(得分:0)

如果我创建一个ALV网格实例(1),则将其添加到父自定义容器中,设置其处理程序,用instance1->free() and free instance1释放它,然后...添加一个新的相同的ALV网格实例(2)到具有处理程序的同一个自定义容器中,(2)的处理程序不起作用((1)的处理程序都不起作用!),并且(1)的工具栏一直显示。

要摆脱这种不受欢迎的状态,并获得动态的工具栏...

如果在创建和释放(1)和创建(2)之间放置一个简单的cl_gui_cfw=>flush( ),则(2)的处理程序将按预期工作,并且工具栏将反映实例的图标(2),符合预期。

如前所述,这仅与一次创建两个实例的情况有关。只有一个不会发生此问题。

答案 3 :(得分:-1)

如果我没记错的话,请refreshing the ALV grid does not rebuild the toolbar

我认为您必须使用'SET_TABLE_FOR_FIRST_DISPLAY'重新初始化ALV网格,以具有其他工具栏功能。