SAP的一个类cl_salv_events_table提供了几个常用的事件,包括链接点击,双击,功能触发之前和触发之后,页眉页脚(其中页眉页脚暂时测试不成功,以后再试)。跟其他事件相比,类CL_SALV_EVENTS_TABLE提供了这几个常用的事件已经和ALV结合在一起,所以我们只要实现这几个事件的处理方法就可以了。
1. 首先我们要定义好事件的处理方法。
CLASS-METHODS:
on_user_command FOR EVENT added_function OF cl_salv_events_table
IMPORTING e_salv_function,
on_double_click
FOR EVENT double_click OF cl_salv_events_table
IMPORTING row column,
on_link_click FOR
EVENT link_click OF cl_salv_events_table
IMPORTING row column,
on_before_salv_function
FOR EVENT before_salv_function OF cl_salv_events_table
IMPORTING e_salv_function,
on_after_salv_function
FOR EVENT after_salv_function OF cl_salv_events_table
IMPORTING e_salv_function.
2. 实现事件的处理方法。
*单击新增功能按钮事件处理方法
METHOD
on_user_command.
CONCATENATE
'Function Code is '
e_salv_function
INTO
g_string SEPARATED BY space.
MESSAGE
i000(0k) WITH g_string.
ENDMETHOD. "on_user_command
*双击事件处理方法
METHOD
on_double_click.
g_string
= row.
CONCATENATE
'DOUBLE CLICK'
'ROW'
g_string
'COLUMN'
column
INTO
g_string SEPARATED BY space.
MESSAGE
i000(0k) WITH g_string.
ENDMETHOD. "on_double_click
*单击事件处理方法
METHOD
on_link_click.
g_string
= row.
CONCATENATE
'LICK CLICK'
'ROW'
g_string
'COLUMN'
column
INTO
g_string SEPARATED BY space.
MESSAGE
i000(0k) WITH g_string.
ENDMETHOD. "on_link_click
*触发事件之前
METHOD
on_before_salv_function.
CONCATENATE
'Before Function '
e_salv_function
INTO
g_string SEPARATED BY space.
MESSAGE
i000(0k) WITH g_string.
ENDMETHOD. "on_before_salv_function
*触发事件之后
METHOD
on_after_salv_function.
CONCATENATE
'After Function '
e_salv_function
INTO
g_string SEPARATED BY space.
MESSAGE
i000(0k) WITH g_string.
ENDMETHOD. "on_after_salv_function
3. 取得ALV事件的实例
lr_events
= gr_table->get_event( ).
4. 注册事件的处理方法
SET
HANDLER lcl_handle_events=>on_user_command FOR lr_events.
SET
HANDLER lcl_handle_events=>on_double_click FOR lr_events.
SET
HANDLER lcl_handle_events=>on_link_click FOR lr_events.
SET
HANDLER lcl_handle_events=>on_before_salv_function FOR lr_events.
SET
HANDLER lcl_handle_events=>on_after_salv_function FOR lr_events.
下面是效果图
![OO实现ALV <wbr>TABLE <wbr>九:ALV的事件[转] OO实现ALV <wbr>TABLE <wbr>九:ALV的事件[转]](http://s14.sinaimg.cn/middle/5ccd375bga6b20776c7bd&690)
下面是程序的所有代码:
REPORT y_xin_002.
INCLUDE
<icon>.
*变量定义
TYPES:
BEGIN OF gs_spfli,
mandt TYPE
spfli-mandt,
carrid TYPE
spfli-carrid,
connid TYPE
spfli-connid,
countryfr TYPE
spfli-countryfr,
cityfrom TYPE
spfli-cityfrom,
airpfrom TYPE
spfli-airpfrom,
countryto TYPE
spfli-countryto,
cityto TYPE
spfli-cityto,
airpto TYPE
spfli-airpto,
fltime TYPE
spfli-fltime,
deptime TYPE
spfli-deptime,
arrtime TYPE
spfli-arrtime,
distance TYPE
spfli-distance,
distid TYPE
spfli-distid,
fltype TYPE
spfli-fltype,
period TYPE
spfli-period,
hotspot TYPE
icon_d,
END
OF gs_spfli.
TYPES ty_spfli
TYPE gs_spfli OCCURS 0.
*----------------------------------------------------------------------*
* CLASS
lcl_handle_events DEFINITION
*----------------------------------------------------------------------*
* 事件操作类(定义)
*----------------------------------------------------------------------*
CLASS
lcl_handle_events DEFINITION.
PUBLIC
SECTION.
CLASS-METHODS:
on_user_command FOR EVENT added_function OF cl_salv_events_table
IMPORTING
e_salv_function,
on_double_click
FOR EVENT double_click OF cl_salv_events_table
IMPORTING
row column,
on_link_click FOR
EVENT link_click OF cl_salv_events_table
IMPORTING
row column,
on_before_salv_function FOR EVENT before_salv_function OF cl_salv_events_table
IMPORTING
e_salv_function,
on_after_salv_function
FOR EVENT after_salv_function OF cl_salv_events_table
IMPORTING
e_salv_function.
PRIVATE
SECTION.
CLASS-DATA:
g_string TYPE string.
ENDCLASS. "lcl_handle_events
DEFINITION
*----------------------------------------------------------------------*
* CLASS
lcl_handle_events IMPLEMENTATION
*----------------------------------------------------------------------*
* 事件操作类(实现)
*----------------------------------------------------------------------*
CLASS
lcl_handle_events IMPLEMENTATION.
*单击新增功能按钮事件处理方法
METHOD
on_user_command.
CONCATENATE
'Function Code is '
e_salv_function
INTO
g_string SEPARATED BY space.
MESSAGE
i000(0k) WITH g_string.
ENDMETHOD. "on_user_command
*双击事件处理方法
METHOD
on_double_click.
g_string
= row.
CONCATENATE
'DOUBLE CLICK'
'ROW'
g_string
'COLUMN'
column
INTO
g_string SEPARATED BY space.
MESSAGE
i000(0k) WITH g_string.
ENDMETHOD. "on_double_click
*单击事件处理方法
METHOD
on_link_click.
g_string
= row.
CONCATENATE
'LICK CLICK'
'ROW'
g_string
'COLUMN'
column
INTO
g_string SEPARATED BY space.
MESSAGE
i000(0k) WITH g_string.
ENDMETHOD. "on_link_click
*触发事件之前
METHOD
on_before_salv_function.
CONCATENATE
'Before Function '
e_salv_function
INTO
g_string SEPARATED BY space.
MESSAGE
i000(0k) WITH g_string.
ENDMETHOD. "on_before_salv_function
*触发事件之后
METHOD
on_after_salv_function.
CONCATENATE
'After Function '
e_salv_function
INTO
g_string SEPARATED BY space.
MESSAGE
i000(0k) WITH g_string.
ENDMETHOD. "on_after_salv_function
ENDCLASS. "lcl_handle_events
IMPLEMENTATION
*----------------------------------------------------------------------*
* CLASS
lcl_alv DEFINITION
*----------------------------------------------------------------------*
* ALV操作类(定义)
*----------------------------------------------------------------------*
CLASS
lcl_alv DEFINITION.
PUBLIC
SECTION.
METHODS:
getdata "取得要显示的数据
RETURNING
value(lt_tab) TYPE ty_spfli,
alv_full "全屏Grid列表处理方法
IMPORTING
value(lt_tab) TYPE ty_spfli.
PRIVATE
SECTION.
DATA:
gr_table TYPE REF TO cl_salv_table.
ENDCLASS. "lcl_alv
DEFINITION
*----------------------------------------------------------------------*
* CLASS
lcl_alv IMPLEMENTATION
*----------------------------------------------------------------------*
* ALV操作类(实现)
*----------------------------------------------------------------------*
CLASS
lcl_alv IMPLEMENTATION.
*取得要显示的数据
METHOD
getdata.
SELECT
* INTO CORRESPONDING FIELDS OF TABLE lt_tab FROM spfli.
FIELD-SYMBOLS
<fs_spfli> TYPE gs_spfli.
LOOP
AT lt_tab ASSIGNING <fs_spfli>.
<fs_spfli>-hotspot
= icon_overview.
ENDLOOP.
ENDMETHOD. "getdata
*输出全屏网格列表的方法
METHOD
alv_full.
DATA:
lr_functions TYPE
REF TO cl_salv_functions_list,
lr_events TYPE
REF TO cl_salv_events_table,
lr_columns TYPE
REF TO cl_salv_columns_table,
lr_column TYPE
REF TO cl_salv_column_table,
lr_content TYPE
REF TO cl_salv_form_element.
"创建实例
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table
= gr_table
CHANGING
t_table =
lt_tab
).
CATCH
cx_salv_msg.
ENDTRY.
"设置GUI
Status
gr_table->set_screen_status(
report
= sy-repid
pfstatus
= 'SALV_STANDARD'
set_functions
= gr_table->c_functions_all
).
"设置热点
lr_columns
= gr_table->get_columns( ).
TRY.
lr_column
?= lr_columns->get_column( 'HOTSPOT' ).
lr_column->set_cell_type(
if_salv_c_cell_type=>hotspot ).
lr_column->set_long_text(
'HOTSPOT' ).
CATCH
cx_salv_not_found.
ENDTRY.
"注册事件
lr_events
= gr_table->get_event( ).
SET
HANDLER lcl_handle_events=>on_user_command FOR lr_events.
SET
HANDLER lcl_handle_events=>on_double_click FOR lr_events.
SET
HANDLER lcl_handle_events=>on_link_click FOR lr_events.
SET
HANDLER lcl_handle_events=>on_before_salv_function FOR lr_events.
SET
HANDLER lcl_handle_events=>on_after_salv_function FOR lr_events.
"显示列表
gr_table->display(
).
ENDMETHOD. "alv_full
ENDCLASS. "lcl_alv
IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Form f_main
*&---------------------------------------------------------------------*
* 整合数据,执行
*----------------------------------------------------------------------*
FORM
f_main.
DATA:
lt_tab TYPE ty_spfli,
lr_alv
TYPE REF TO lcl_alv.
CREATE
OBJECT lr_alv.
"取得要显示的数据
lt_tab
= lr_alv->getdata( ).
lr_alv->alv_full(
lt_tab ).
ENDFORM. "f_main
*执行动作
START-OF-SELECTION.
PERFORM
f_main.