效果如图:
CODE:
REPORT z_wuwei_0010.
TYPE-POOLS: slis.
INCLUDE <icons>.
TYPES: BEGIN OF itype_alv_flight,
radio1(4), "Radio button
carrid TYPE sflight-carrid,
connid TYPE sflight-connid,
END OF itype_alv_flight.
CLASS lcl_handle_events DEFINITION DEFERRED.
DATA: gr_table TYPE REF TO cl_salv_table.
DATA: gr_container TYPE REF TO cl_gui_custom_container.
DATA: gr_events TYPE REF TO lcl_handle_events.
DATA: it_alv_flight TYPE STANDARD TABLE OF itype_alv_flight.
*---------------------------------------------------------------------*
* CLASS lcl_handle_events DEFINITION
*---------------------------------------------------------------------*
CLASS lcl_handle_events DEFINITION.
PUBLIC SECTION.
METHODS:
on_link_click FOR EVENT link_click OF cl_salv_events_table
IMPORTING row column.
ENDCLASS. "lcl_handle_events DEFINITION
*---------------------------------------------------------------------*
* CLASS lcl_handle_events IMPLEMENTATION
*---------------------------------------------------------------------*
CLASS lcl_handle_events IMPLEMENTATION.
METHOD on_link_click.
PERFORM user_command USING row column.
ENDMETHOD. "on_single_click
ENDCLASS. "lcl_handle_events IMPLEMENTATION
SELECTION-SCREEN BEGIN OF BLOCK dsp WITH FRAME.
SELECTION-SCREEN END OF BLOCK dsp.
*----------------------------------------------------------------------*
* START-OF-SELECTION *
*----------------------------------------------------------------------*
START-OF-SELECTION.
FIELD-SYMBOLS: <fs_grid> TYPE itype_alv_flight.
SELECT carrid connid FROM sflight
INTO CORRESPONDING FIELDS OF TABLE it_alv_flight
UP TO 20 ROWS.
LOOP AT it_alv_flight ASSIGNING <fs_grid>.
<fs_grid>-radio1 = icon_wd_radio_button_empty. "Empty Radio Buttons
ENDLOOP.
TRY.
cl_salv_table=>factory(
EXPORTING
list_display = 'X'
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = it_alv_flight ).
CATCH cx_salv_msg. "#EC NO_HANDLER
ENDTRY.
TRY.
gr_table->set_screen_popup(
start_column = 10
end_column = 60
start_line = 4
end_line = 15 ).
CATCH cx_salv_msg.
ENDTRY.
* set icon column and make it a hotspot
DATA: lr_columns TYPE REF TO cl_salv_columns,
lr_column TYPE REF TO cl_salv_column_table.
lr_columns = gr_table->get_columns( ).
TRY.
lr_column ?= lr_columns->get_column( 'RADIO1' ).
lr_column->set_icon( if_salv_c_bool_sap=>true ).
lr_column->set_cell_type( if_salv_c_cell_type=>hotspot ).
lr_column->set_long_text( text-001 ).
CATCH cx_salv_not_found. "#EC NO_HANDLER
ENDTRY.
* turn off front-end handler
DATA: lr_selections TYPE REF TO cl_salv_selections.
lr_selections = gr_table->get_selections( ).
lr_selections->set_selection_mode( if_salv_c_selection_mode=>none ).
* capture events
DATA: lr_events TYPE REF TO cl_salv_events_table.
lr_events = gr_table->get_event( ).
CREATE OBJECT gr_events.
SET HANDLER gr_events->on_link_click FOR lr_events.
* display the table
gr_table->display( ).
*&---------------------------------------------------------------------*
*& Form user_command
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->ROW text
* -->COLUMN text
*----------------------------------------------------------------------*
FORM user_command USING row TYPE i
column TYPE lvc_fname.
DATA: refr_stable TYPE lvc_s_stbl.
FIELD-SYMBOLS: <fs_itab> LIKE LINE OF it_alv_flight.
IF column = 'RADIO1'.
LOOP AT it_alv_flight ASSIGNING <fs_itab>.
IF sy-tabix <> row.
<fs_itab>-radio1 = icon_wd_radio_button_empty.
ENDIF.
ENDLOOP.
READ TABLE it_alv_flight INDEX row ASSIGNING <fs_itab>.
IF <fs_itab>-radio1 = icon_radiobutton.
ELSE.
<fs_itab>-radio1 = icon_radiobutton.
ENDIF.
ENDIF.
refr_stable-row = abap_true.
gr_table->refresh( s_stable = refr_stable refresh_mode = if_salv_c_refresh=>full ).
ENDFORM. "USER_COMMAND