1、直接写程序,但是这种方式只能用于双击事件
when '&IC1'.
if rs_selfield-fieldname = 'SEL'.
perform frm_check_box using rs_selfield.
endif.
form frm_check_box using ps_selfield type slis_selfield.
read table gt_alv into gs_alv index ps_selfield-tabindex.
check sy-subrc = 0.
loop at gt_alv assigning field-symbol(<fs_alv>) where vbeln = gs_alv-vbeln.
if <fs_alv>-sel = 'X'.
clear <fs_alv>-sel. "如果最开始是选中了那个数据,那么要先取消选中,然后双击再把编号相同的数据都勾选上
else.
<fs_alv>-sel = 'X'.
endif.
endloop.
endform.
2、利用事件的方法来实现(这种既可以单击也可以双击)
*&---------------------------------------------------------------------*
*& 包含 ZSDF036_C01
*&---------------------------------------------------------------------*
class cl_event_receiver definition.
public section.
methods:
handle_data_changed
for event data_changed of cl_gui_alv_grid
importing er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
endclass. "cl_event_receiver DEFINITION
data:g_alv_grid type ref to cl_gui_alv_grid,
g_cl_event_receiver type ref to cl_event_receiver.
*----------------------------------------------------------------------*
* CLASS cl_event_receiver IMPLEMENTATION
*----------------------------------------------------------------------*
* 注册事件类
*----------------------------------------------------------------------*
class cl_event_receiver implementation.
" 数据变更事件
method handle_data_changed.
perform frm_data_changed using er_data_changed.
endmethod. "HANDLE_DATA_CHANGED
endclass. "cl_event_receiver IMPLEMENTATION
*&---------------------------------------------------------------------*
*& Form frm_data_changed
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> ER_DATA_CHANGED
*&---------------------------------------------------------------------*
form frm_data_changed using p_er_data_changed
type ref to cl_alv_changed_data_protocol.
data: lt_modi type lvc_t_modi,
lw_modi type lvc_s_modi.
MOVE p_er_data_changed->mt_mod_cells TO lt_modi.
loop at lt_modi into lw_modi.
read table gt_data assigning field-symbol(<fs_alv>) index lw_modi-row_id.
if sy-subrc eq 0.
case lw_modi-fieldname.
when 'CHBOX'.
loop at gt_data assigning field-symbol(<fs_alv_c>) where vbeln = <fs_alv>-vbeln.
if <fs_alv_c>-chbox is initial.
<fs_alv_c>-chbox = 'X'.
else.
<fs_alv_c>-chbox = ''.
endif.
endloop.
when others.
endcase.
endif.
endloop.
perform frm_alv_refresh.
endform.
*&---------------------------------------------------------------------*
*& Form frm_alv_refresh
*&---------------------------------------------------------------------*
*& text
*&---------------------------------------------------------------------*
*& --> p1 text
*& <-- p2 text
*&---------------------------------------------------------------------*
form frm_alv_refresh .
data: ls_stable type lvc_s_stbl.
ls_stable-row = 'X'.
ls_stable-col = 'X'.
call method g_alv_grid->refresh_table_display
exporting
is_stable = ls_stable
* i_soft_refresh = 'X'
exceptions
finished = 1
others = 2.
if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
endif.
endform.
然后再调用ALV显示函数之前需要加上事件:
gs_events-name = 'CALLER_EXIT'.
gs_events-form = 'REGISTER_EVENTS'.
APPEND gs_events TO gt_events.
注册事件的代码:
*&---------------------------------------------------------------------*
*& Form register_events
*&---------------------------------------------------------------------*
* 注册事件,包括回车及光标定位
*----------------------------------------------------------------------*
form register_events using fu_grid type slis_data_caller_exit.
call function 'GET_GLOBALS_FROM_SLVC_FULLSCR'
importing
e_grid = g_alv_grid.
call method g_alv_grid->register_edit_event
exporting
i_event_id = cl_gui_alv_grid=>mc_evt_enter
* EXCEPTIONS
* error = 1
* others = 2
.
if sy-subrc <> 0.
* MESSAGE ID SY-MSGID TYPE SY-MSGTY NUMBER SY-MSGNO
* WITH SY-MSGV1 SY-MSGV2 SY-MSGV3 SY-MSGV4.
endif.
call method g_alv_grid->register_edit_event
exporting
i_event_id = cl_gui_alv_grid=>mc_evt_modified
* EXCEPTIONS
* error = 1
* others = 2
.
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 g_cl_event_receiver.
* SET HANDLER g_cl_event_receiver->handle_modify FOR g_alv_grid.
set handler g_cl_event_receiver->handle_data_changed for g_alv_grid.
* SET HANDLER g_cl_event_receiver->handle_double_click FOR g_alv_grid."双击
* SET HANDLER g_cl_event_receiver->handle_hotspot_click FOR g_alv_grid."单击
endform. "register_events
**最后在调用ALV显示的那个函数里面一定要加上这一句话**
it_events = gt_events