• OO ALV-单击事件,双击事件,添加自定义按钮事件(EVENT)实例


    OO ALV中经常会用的行单击,行双击,application tool bar上添加按钮以及按钮的相应事件,如下:

    1,单击:handle_hotspot_click 事件

    2,双击:handle_double_click

    3,工具栏上添加自定按钮: handle_toolbar,其中,butn_type = 3. 是分隔符详细参照下面代码

    4, 自定义按钮相应事件:handle_command

    这些事件需要用SET HANDLER先注册,然后再在类中实现,添加自己的逻辑。

    下面是个完整代码以及相关屏幕的创建过程:

    1) 创建0100屏幕

    屏幕PAI,PBO中流逻辑代码

    PROCESS BEFORE OUTPUT.
      MODULE STATUS_0100.
      MODULE INIT_CON.
     
    PROCESS AFTER INPUT.
     MODULE USER_EXIT_0100 AT EXIT-COMMAND.

    2017-02-27_13-52-59

    2)  在0100屏幕上画自定义控件,命名为CUS01

    在屏幕点击下面红框内的按钮创建控件CUS01.

    2017-02-27_13-21-07

    3,程序中的Status

    2017-02-27_13-47-59

    4,程序代码

    REPORT ZTEST_OO_ALV_EVENT.
    
    DATA: gs_data TYPE spfli.
    
    DATA: gt_data LIKE TABLE OF gs_data.
    
    DATA: g_con01  TYPE REF TO cl_gui_custom_container.
    
    DATA: g_grid01 TYPE REF TO cl_gui_alv_grid.
    
    DATA: gs_fieldcat TYPE lvc_s_fcat.
    DATA: gt_fieldcat TYPE lvc_t_fcat.
    
    CONSTANTS: g_cus01 TYPE scrfname VALUE 'CUS01'.
    
    *----------------------------------------------------------------------*
    *       CLASS cl_event_receiver DEFINITION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS cl_event_receiver DEFINITION.
      PUBLIC SECTION.
        " 声明单击事件的方法
        METHODS handle_hotspot_click
          FOR EVENT hotspot_click OF cl_gui_alv_grid
          IMPORTING e_row_id e_column_id.
        " 声明双击事件方法
        METHODS handle_double_click
          FOR EVENT double_click OF cl_gui_alv_grid
          IMPORTING e_row e_column.
        " 声明Toolbar事件方法
        METHODS handle_toolbar
          FOR EVENT toolbar OF cl_gui_alv_grid
          IMPORTING e_object e_interactive.
        " 声明USER-COMMAND 事件方法
        METHODS handle_command
          FOR EVENT user_command OF cl_gui_alv_grid
          IMPORTING e_ucomm.
    ENDCLASS.                    "cl_event_receiver DEFINITION
    
    *----------------------------------------------------------------------*
    *       CLASS cl_event_receiver IMPLEMENTATION
    *----------------------------------------------------------------------*
    *
    *----------------------------------------------------------------------*
    CLASS cl_event_receiver IMPLEMENTATION.
      " 单击事件方法的实现
      METHOD handle_hotspot_click.
        CONDENSE e_row_id     NO-GAPS.
        CONDENSE e_column_id  NO-GAPS.
        MESSAGE i001(00) WITH '单击事件->行号:' e_row_id  '、列名:' e_column_id.
      ENDMETHOD.                    "handle_HOTSPOT_CLICK
      " 双击事件方法的实现
      METHOD handle_double_click.
        CONDENSE e_row     NO-GAPS.
        CONDENSE e_column  NO-GAPS.
        MESSAGE i001(00) WITH '双击事件->行号:' e_row  '、列名:' e_column.
      ENDMETHOD.                    "handle_double_click
      " 实现Toolbar事件方法
      METHOD handle_toolbar.
        DATA: ls_toolbar TYPE stb_button.
        CLEAR: ls_toolbar.
        ls_toolbar-butn_type = 3. " 分隔符
        APPEND ls_toolbar TO e_object->mt_toolbar.
        CLEAR: ls_toolbar.
        ls_toolbar-function = 'DISP'.    " 功能码
        ls_toolbar-icon = icon_display.  " 图标名称
        ls_toolbar-quickinfo = '显示'.   " 图标的提示信息
        ls_toolbar-butn_type = 0.        " 0表示正常按钮
        ls_toolbar-disabled = ''.        " X表示灰色,不可用
        ls_toolbar-text = '按钮1'.       " 按钮上显示的文本
        APPEND ls_toolbar TO e_object->mt_toolbar.
      ENDMETHOD.                    "handle_toolbar
      " 实现USER-COMMAND 事件方法
      METHOD handle_command.
        CASE e_ucomm.
          WHEN 'DISP'.
            MESSAGE i001(00) WITH 'Toolbar事件 + USER-COMMAND事件 '.
        ENDCASE.
      ENDMETHOD.                    "HANDLE_COMMAND
    
    ENDCLASS.                    "cl_event_receiver IMPLEMENTATION
    DATA: event_receiver TYPE REF TO cl_event_receiver.
    
    START-OF-SELECTION.
      PERFORM get_data.
    
      CALL SCREEN 100.
    
    *&---------------------------------------------------------------------*
    *&      Form  GET_DATA
    *&---------------------------------------------------------------------*
    *       text  获取数据
    *----------------------------------------------------------------------*
    FORM get_data.
      SELECT *
        INTO CORRESPONDING FIELDS OF TABLE gt_data
        UP TO 30 ROWS
        FROM spfli.
    
    ENDFORM.                    "GET_DATA
    
    *&---------------------------------------------------------------------*
    *&      Form  SET_FIELDCAT
    *&---------------------------------------------------------------------*
    *       text  ALV显示字段文本
    *----------------------------------------------------------------------*
    FORM set_fieldcat.
      CLEAR: gt_fieldcat[].
      DEFINE macro_fieldcat.
        clear gs_fieldcat.
        gs_fieldcat-fieldname = &1.
        gs_fieldcat-coltext   = &2.
        gs_fieldcat-hotspot   = &3.
        append gs_fieldcat to gt_fieldcat.
      END-OF-DEFINITION.
    
      macro_fieldcat 'CARRID'     '航线代码'   'X'.
      macro_fieldcat 'CONNID'     '航班连接Id' ''.
      macro_fieldcat 'COUNTRYFR'  '起飞国家'   ''.
      macro_fieldcat 'CITYFROM'   '起飞城市'   ''.
      macro_fieldcat 'AIRPFROM'   '起飞机场'   ''.
      macro_fieldcat 'COUNTRYTO'  '目标国家'   ''.
      macro_fieldcat 'CITYTO'     '目标城市'   ''.
      macro_fieldcat 'AIRPTO'     '目标机场'   ''.
      macro_fieldcat 'FLTIME'     '航班时间'   ''.
      macro_fieldcat 'DEPTIME'    '启程时间'   ''.
      macro_fieldcat 'ARRTIME'    '到达时间'   ''.
      macro_fieldcat 'DISTANCE'   '距离'       ''.
    
    ENDFORM.                    "SET_FIELDCAT
    
    *&---------------------------------------------------------------------*
    *&      Form  SET_LAYOUT
    *&---------------------------------------------------------------------*
    *       text  布局
    *----------------------------------------------------------------------*
    *      -->P_LAYOUT   text
    *----------------------------------------------------------------------*
    FORM set_layout CHANGING p_layout TYPE lvc_s_layo.
      p_layout-cwidth_opt = 'X'.   " 自动调节字段长度
      p_layout-sel_mode   = 'D'.   " 选择模式,可选择多行
      p_layout-zebra      = 'X'.   " 颜色交替显示
    ENDFORM.                      "SET_LAYOUT
    
    *&---------------------------------------------------------------------*
    *&      Module  INIT_CON  OUTPUT
    *&---------------------------------------------------------------------*
    *       text  创建ALV
    *----------------------------------------------------------------------*
    MODULE init_con OUTPUT.
    
      DATA: ls_layout TYPE lvc_s_layo.
    
      IF g_con01 IS INITIAL.
        PERFORM set_fieldcat.
        PERFORM set_layout CHANGING ls_layout.
    
        " 创建SAP容器实例
        CREATE OBJECT g_con01
          EXPORTING
            container_name              = g_cus01 " 自定义控件名称
          EXCEPTIONS
            cntl_error                  = 1
            cntl_system_error           = 2
            create_error                = 3
            lifetime_error              = 4
            lifetime_dynpro_dynpro_link = 5
            OTHERS                      = 6.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                     WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.
        " 创建GRID实例
        CREATE OBJECT g_grid01
          EXPORTING
            i_parent          = g_con01
          EXCEPTIONS
            error_cntl_create = 1
            error_cntl_init   = 2
            error_cntl_link   = 3
            error_dp_create   = 4
            OTHERS            = 5.
        IF sy-subrc <> 0.
          MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno
                     WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.
        ENDIF.
    
        CREATE OBJECT event_receiver.
        " 注册事件handler方法
        SET HANDLER event_receiver->handle_hotspot_click  FOR g_grid01.
        SET HANDLER event_receiver->handle_double_click   FOR g_grid01.
        SET HANDLER event_receiver->handle_toolbar FOR g_grid01.
        SET HANDLER event_receiver->handle_command FOR g_grid01.
    
        " 调用ALV 显示方法
        CALL METHOD g_grid01->set_table_for_first_display
          EXPORTING
    *       i_structure_name              = 'SPFLI' " 参照表结构字段显示
            is_layout                     = ls_layout " 布局
          CHANGING
            it_fieldcatalog               = gt_fieldcat " 显示字段
            it_outtab                     = gt_data[]
          EXCEPTIONS
            invalid_parameter_combination = 1
            program_error                 = 2
            too_many_lines                = 3
            OTHERS                        = 4.
        IF sy-subrc <> 0.
    *     Implement suitable error handling here
        ENDIF.
    
      ENDIF.
    
    ENDMODULE.                 " INIT_CON  OUTPUT
    
    *&---------------------------------------------------------------------*
    *&      Module  STATUS_0100  OUTPUT
    *&---------------------------------------------------------------------*
    *       text  工具条
    *----------------------------------------------------------------------*
    MODULE status_0100 OUTPUT.
      SET PF-STATUS 'S0001'.
    
    ENDMODULE.                 " STATUS_0100  OUTPUT
    *&---------------------------------------------------------------------*
    *&      Module  USER_EXIT_0100  INPUT
    *&---------------------------------------------------------------------*
    *       text  取消事件
    *----------------------------------------------------------------------*
    MODULE user_exit_0100 INPUT.
      LEAVE TO SCREEN 0.
    ENDMODULE.                 " USER_EXIT_0100  INPUT

    5,运行效果

    2017-02-27_13-49-33

    2017-02-27_13-50-06

    2017-02-27_13-50-33

    以上

  • 相关阅读:
    JQuery 简单实现折叠菜单
    机械迷城攻略2
    ffmpeg视频转换及截图
    机械迷城攻略3
    SQL:清空数据库所有数据
    .net发送邮件outlook中文乱码
    我读我的Book
    转:精妙SQL语句收集
    SQL server 动态查询(表名或字段动态),并且获取想得到的返回值结果
    软件开发中,这些文档你用到了吗
  • 原文地址:https://www.cnblogs.com/datie/p/11435756.html
Copyright © 2020-2023  润新知