动态自定义工具栏



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

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

我可以实现您正在寻找的功能,但不清楚您的确切流程是什么,问题可能有几个起源。因此,这是一个简短的演示,您应该如何做到这一点(程序在工具栏中显示一个按钮,您单击它并消失,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( ).

如果我没记错的话,刷新 ALV 网格不会重建工具栏。

我认为您必须使用"SET_TABLE_FOR_FIRST_DISPLAY"重新初始化 ALV 网格才能获得额外的工具栏功能。

Sandra Rosssi是对的。 ALVG 有两个不同的实例,处理程序变得混乱,这就是工具栏无法正确刷新的原因。

谢谢大家,

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

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

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

如前所述,这仅适用于"一次性"创建两个实例的情况。问题不会只发生一个。

最新更新