之前介绍过两种拦截标准工具栏点击事件的办法,现在又发现了第三种,比前两种简单。
见效果图
说明: 通过alv事件before_user_command 可以拦截到所有的按钮事件,右键菜单事件。并可以通过set_user_command方法设置不同的事件或设置为空来屏蔽该事件的执行。
废话不多说,上代码
REPORT test.
CLASS lcl_event DEFINITION .
PUBLIC SECTION.
CLASS-METHODS:
toolbar FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object e_interactive,
before_user_command FOR EVENT before_user_command OF cl_gui_alv_grid IMPORTING e_ucomm sender.
ENDCLASS.
CLASS lcl_event IMPLEMENTATION.
METHOD before_user_command.
CASE e_ucomm.
WHEN '&SORT_ASC'.
MESSAGE '我是倒排序哦!' TYPE 'I'.
sender->set_user_command( '&SORT_DSC' ).
WHEN '&XXL'.
MESSAGE '可以先对数据处理后再导出到excel' TYPE 'I'.
WHEN '&SORT_DSC'.
MESSAGE '我是正排序哦!' TYPE 'I'.
sender->set_user_command( '&SORT_ASC' ).
WHEN 'SORT'.
MESSAGE '调用标准的顺序排序' TYPE 'I'.
sender->set_user_command( '&SORT_ASC' ).
ENDCASE.
ENDMETHOD.
METHOD toolbar.
DATA ls_toolbar TYPE stb_button.
ls_toolbar-function = 'SORT'.
ls_toolbar-text = 'SORT'.
APPEND ls_toolbar TO e_object->mt_toolbar .
ENDMETHOD.
ENDCLASS.
DATA o_con TYPE REF TO cl_gui_docking_container.
DATA gt_makt TYPE TABLE OF makt.
DATA ls_row_no TYPE lvc_s_roid.
DATA ls_col_info TYPE lvc_s_col.
DATA gt_fcat TYPE lvc_t_fcat.
DATA gs_fcat TYPE lvc_s_fcat.
DATA o_alv TYPE REF TO cl_gui_alv_grid.
DEFINE __fcat.
gs_fcat-fieldname = &1.
gs_fcat-reptext = &2.
gs_fcat-ref_table = 'MAKT'.
gs_fcat-ref_field = &1.
APPEND gs_fcat TO gt_fcat.
end-of-definition.
PARAMETER p_p1 TYPE c.
AT SELECTION-SCREEN OUTPUT.
SELECT * INTO TABLE gt_makt FROM makt.
IF o_con IS INITIAL.
CREATE OBJECT :
o_con EXPORTING side = cl_gui_docking_container=>dock_at_bottom ratio = 90,
o_alv EXPORTING i_parent = o_con .
__fcat:
'MATNR' '物料号',
'MAKTX' '物料描述'.
SET HANDLER lcl_event=>before_user_command lcl_event=>toolbar FOR o_alv .
o_alv->set_table_for_first_display( CHANGING it_outtab = gt_makt it_fieldcatalog = gt_fcat ).
ENDIF.