header 单击 ALV 网格中的事件?
Event for header click in ALV grid?
是否可以在 ALV 网格列上捕获单击按钮 header?我知道捕获 double_click 的可能性,为单元格上的热点创建事件。我还没有找到一个 header 点击。 (我不想提供排序或任何其他数据选项)。我唯一发现的是事件 click_col_header OF cl_gui_alv_grid 但它受到保护,所以我无法提供我的操作。
提前致谢!
是的。以下是如何使用 CL_GUI_ALV_GRID
:
- 设置 ALV 布局设置
SGL_CLK_HD = 'X'
(这将激活基于单击列的行排序)
- 通过处理事件
BEFORE_USER_COMMAND
并使用方法 SET_USER_COMMAND
设置新命令,用您自己的代码重新定义排序行为
- 定义活动期间您想要的新行为
USER_COMMAND
- 使用方法
GET_SELECTED_COLUMNS
知道点击了哪一列
(PS:如果有人想知道,CL_GUI_ALV_GRID
有事件 CLICK_COL_HEADER
,但从未触发过)
这是一个演示(也在 SAP forum 中的 Raymond 答案下方发布):
CLASS lcl_alv DEFINITION.
PUBLIC SECTION.
METHODS constructor.
METHODS free.
METHODS on_before_user_command FOR EVENT before_user_command OF cl_gui_alv_grid IMPORTING e_ucomm.
METHODS on_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm.
DATA go_alv TYPE REF TO cl_gui_alv_grid.
DATA gt_sflight TYPE TABLE OF sflight.
ENDCLASS.
CLASS lcl_alv IMPLEMENTATION.
METHOD constructor.
CREATE OBJECT go_alv
EXPORTING
i_parent = cl_gui_container=>screen0.
SET HANDLER on_user_command FOR go_alv.
SET HANDLER on_before_user_command FOR go_alv.
SELECT * FROM sflight INTO TABLE gt_sflight.
go_alv->set_table_for_first_display(
EXPORTING
i_structure_name = 'SFLIGHT'
is_layout = VALUE #( sgl_clk_hd = abap_true )
CHANGING
it_outtab = gt_sflight ).
ENDMETHOD.
METHOD free.
go_alv->free( ).
ENDMETHOD.
METHOD on_before_user_command.
CASE e_ucomm.
WHEN go_alv->mc_fc_sort.
go_alv->set_user_command( i_ucomm = 'ZZSORT' ).
ENDCASE.
ENDMETHOD.
METHOD on_user_command.
CASE e_ucomm.
WHEN 'ZZSORT'.
go_alv->get_selected_columns( IMPORTING et_index_columns = data(columns) ).
MESSAGE |Columns: { COND #( WHEN lines( columns ) > 0 THEN columns[ 1 ]-fieldname ) }| TYPE 'I'.
ENDCASE.
ENDMETHOD.
ENDCLASS.
DATA go_alv TYPE REF TO lcl_alv.
PARAMETERS dummy.
AT SELECTION-SCREEN OUTPUT.
IF go_alv IS NOT BOUND.
go_alv = NEW lcl_alv( ).
ENDIF.
AT SELECTION-SCREEN ON EXIT-COMMAND.
go_alv->free( ).
FREE go_alv.
是否可以在 ALV 网格列上捕获单击按钮 header?我知道捕获 double_click 的可能性,为单元格上的热点创建事件。我还没有找到一个 header 点击。 (我不想提供排序或任何其他数据选项)。我唯一发现的是事件 click_col_header OF cl_gui_alv_grid 但它受到保护,所以我无法提供我的操作。 提前致谢!
是的。以下是如何使用 CL_GUI_ALV_GRID
:
- 设置 ALV 布局设置
SGL_CLK_HD = 'X'
(这将激活基于单击列的行排序) - 通过处理事件
BEFORE_USER_COMMAND
并使用方法SET_USER_COMMAND
设置新命令,用您自己的代码重新定义排序行为
- 定义活动期间您想要的新行为
USER_COMMAND
- 使用方法
GET_SELECTED_COLUMNS
知道点击了哪一列
(PS:如果有人想知道,CL_GUI_ALV_GRID
有事件 CLICK_COL_HEADER
,但从未触发过)
这是一个演示(也在 SAP forum 中的 Raymond 答案下方发布):
CLASS lcl_alv DEFINITION.
PUBLIC SECTION.
METHODS constructor.
METHODS free.
METHODS on_before_user_command FOR EVENT before_user_command OF cl_gui_alv_grid IMPORTING e_ucomm.
METHODS on_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm.
DATA go_alv TYPE REF TO cl_gui_alv_grid.
DATA gt_sflight TYPE TABLE OF sflight.
ENDCLASS.
CLASS lcl_alv IMPLEMENTATION.
METHOD constructor.
CREATE OBJECT go_alv
EXPORTING
i_parent = cl_gui_container=>screen0.
SET HANDLER on_user_command FOR go_alv.
SET HANDLER on_before_user_command FOR go_alv.
SELECT * FROM sflight INTO TABLE gt_sflight.
go_alv->set_table_for_first_display(
EXPORTING
i_structure_name = 'SFLIGHT'
is_layout = VALUE #( sgl_clk_hd = abap_true )
CHANGING
it_outtab = gt_sflight ).
ENDMETHOD.
METHOD free.
go_alv->free( ).
ENDMETHOD.
METHOD on_before_user_command.
CASE e_ucomm.
WHEN go_alv->mc_fc_sort.
go_alv->set_user_command( i_ucomm = 'ZZSORT' ).
ENDCASE.
ENDMETHOD.
METHOD on_user_command.
CASE e_ucomm.
WHEN 'ZZSORT'.
go_alv->get_selected_columns( IMPORTING et_index_columns = data(columns) ).
MESSAGE |Columns: { COND #( WHEN lines( columns ) > 0 THEN columns[ 1 ]-fieldname ) }| TYPE 'I'.
ENDCASE.
ENDMETHOD.
ENDCLASS.
DATA go_alv TYPE REF TO lcl_alv.
PARAMETERS dummy.
AT SELECTION-SCREEN OUTPUT.
IF go_alv IS NOT BOUND.
go_alv = NEW lcl_alv( ).
ENDIF.
AT SELECTION-SCREEN ON EXIT-COMMAND.
go_alv->free( ).
FREE go_alv.