首页 > 解决方案 > ALV 网格中的标题点击事件?

问题描述

是否可以单击 ALV Grid 列标题上的单个按钮?我知道捕捉 double_click 的可能性,为单元格上的热点创建事件。我还没有找到一个标题点击。(我不想提供排序或任何其他数据选项)。我发现的唯一一件事是事件click_col_header OF cl_gui_alv_grid但它受到保护,因此我无法提供我的操作。先感谢您 !

标签: abapalv

解决方案


是的。以下是如何做到这一点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 论坛的 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.

推荐阅读