由于类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()。
当我进入调试模式时,我看到添加或删除了保存按钮,但是一旦工具栏一次显示出来,它就不会显示在屏幕上。
答案 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网格,以具有其他工具栏功能。