自定义ALV控件的工具条按钮

*&---------------------------------------------------------------------*
*& Report  YTEST028
*&
*&---------------------------------------------------------------------*
*&
*&
*&---------------------------------------------------------------------*

REPORT  ytest028.
*定义使用图标,按钮使用
INCLUDE <icon>.

*定义事件类型
CLASS lcl_event_receiver DEFINITION DEFERRED.

*功能码返回值
DATA: ok_code TYPE sy-ucomm,
      save_ok TYPE sy-ucomm.

*定义事件
DATA event_receiver TYPE REF TO lcl_event_receiver.


*定义内表,变量需要传递,不加header line
DATA: wa_spfli TYPE TABLE OF spfli ,"WITH HEADER LINE.
      a_spfli LIKE spfli.

*内表赋值
SELECT * INTO TABLE wa_spfli FROM spfli.

*定义窗口定制控制,定义ALV对象
DATA: wa_container TYPE scrfname VALUE 'ALVDATA',
      alv_grid TYPE REF TO cl_gui_alv_grid,
      wa_custom_container TYPE REF TO cl_gui_custom_container.

*直接调用窗口
CALL SCREEN 300.

*定义是件的属性和方法
CLASS lcl_event_receiver DEFINITION.
*公共事件
  PUBLIC SECTION.
    METHODS:
*按钮处理方法
  handle_toolbar
  FOR EVENT toolbar OF cl_gui_alv_grid
  IMPORTING e_object e_interactive,
*用户交互是件处理
  handle_user_command
  FOR EVENT user_command OF cl_gui_alv_grid
  IMPORTING e_ucomm.
ENDCLASS.                    "lcl_event_receiver DEFINITION

*实现方法
CLASS lcl_event_receiver IMPLEMENTATION .
*处理按钮事件
  METHOD handle_toolbar.
    DATA:ls_toolbar TYPE stb_button.
    CLEAR ls_toolbar.
    MOVE 3 TO ls_toolbar-butn_type.
*取工具条接口
    APPEND ls_toolbar TO e_object->mt_toolbar.
    CLEAR ls_toolbar.
*加入功能码
    MOVE ' SHOW_DETA' TO ls_toolbar-function.
*图标,可以用SHOWICON系统程序查阅需使用的图标
    MOVE icon_ppe_vnode TO ls_toolbar-icon.
*按钮文本和提示
    MOVE '航班明细显示' TO  ls_toolbar-quickinfo.
    MOVE '航班明细显示'(112) TO  ls_toolbar-text.
    MOVE '' TO  ls_toolbar-disabled.
    APPEND ls_toolbar TO e_object->mt_toolbar.
  ENDMETHOD.                    "handle_toolbar

*处理功能码事件
  METHOD handle_user_command.
    DATA:lt_rows TYPE lvc_t_row.
    CASE  e_ucomm.
*定义的按钮事件
      WHEN 'SHOW_DETA'.
*取得所有选择
        CALL METHOD alv_grid->get_selected_rows
          IMPORTING
            et_index_rows = lt_rows.
        CALL METHOD cl_gui_cfw=>flush.
        IF sy-subrc EQ 0.
*提示成功
          MESSAGE '已选择行' TYPE 'S'.
*调用子程序显示选择行内容
          PERFORM messdeta TABLES lt_rows.
        ENDIF.
    ENDCASE.
  ENDMETHOD.                    "handle_user_command

ENDCLASS.                    "clc_event_receiver IMPLEMENTATION

*&---------------------------------------------------------------------*
*&      Module  STATUS_0300  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
*用户交互
MODULE status_0300 OUTPUT.
  SET PF-STATUS 'STATUS1'.
*  SET TITLEBAR 'xxx'.


*如果窗口还没有创建ALV对象则它
  IF wa_custom_container IS INITIAL.
    CREATE OBJECT wa_custom_container
      EXPORTING
        container_name = wa_container.
    CREATE OBJECT alv_grid
      EXPORTING
        i_parent = wa_custom_container.
    CALL METHOD alv_grid->set_table_for_first_display
      EXPORTING
        i_structure_name = 'SPFLI'
      CHANGING
        it_outtab        = wa_spfli.

*创建事件
    CREATE OBJECT event_receiver.
*将用户交互事件分配ALV
    SET HANDLER event_receiver->handle_user_command FOR alv_grid.
*将按钮相关事件分配ALV
    SET HANDLER event_receiver->handle_toolbar FOR alv_grid.
*调用处理工具条处理方法,使自定义工具条生效
    CALL METHOD alv_grid->set_toolbar_interactive.

  ENDIF.

ENDMODULE.                 " STATUS_0300  OUTPUT

*显示选择行内容模块
FORM messdeta TABLES p_et_index_rows STRUCTURE lvc_s_row.
*定义选择行
  DATA:ls_selected_line LIKE lvc_s_row,
        lf_row_index TYPE lvc_index.
*定义合并字段及分隔字段
  DATA:s1(200) TYPE c,
        s2(3) TYPE c.
  s2 = '-'.

*读取所有选择行
  LOOP AT p_et_index_rows INTO ls_selected_line.
    lf_row_index = ls_selected_line-index.
*从内表中按序号读取内容
    READ TABLE wa_spfli INDEX lf_row_index INTO a_spfli.
*合并
    s1 = '选择行内容'.
    CONCATENATE s1 a_spfli-connid a_spfli-carrid a_spfli-cityfrom INTO s1 SEPARATED BY s2.

*弹出窗口提示
    MESSAGE i005(ymes) WITH s1.


  ENDLOOP.
ENDFORM.                    "messdeta
*&---------------------------------------------------------------------*
*&      Module  EXIT  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE exit INPUT.
  save_ok = ok_code.
  CLEAR ok_code.
  CASE save_ok.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.                 " EXIT  INPUT
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0300  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE user_command_0300 INPUT.

ENDMODULE.                 " USER_COMMAND_0300  INPUT

效果:

原文地址:https://www.cnblogs.com/caizjian/p/3363046.html