添加复选框功能
要获得可编辑的复选框,首先我们需要从 column 对象中获取显示内表中定义的 checkbox 字段列。
此后,我们需要使用方法 SET_CELL_TYPE 将单元格类型设置为 IF_SALV_C_CELL_TYPE => CHECKBOX_HOTSPOT。
更新复选框中的值,需要处理事件 ON_LINK_CLICK。当单击启用热点的复选框时,将触发 LINK_CLICK 事件。在事件处理程序方法中,需要更改复选框字段的值并调用 REFRESH 方法以刷新 ALV 上的值。
*&---------------------------------------------------------------------*
*& SALV Table, editable checkbox
*&---------------------------------------------------------------------*
REPORT zsalv_editable_checkbox.
CLASS lcl_event_handler DEFINITION.
PUBLIC SECTION.
METHODS:
on_link_click FOR EVENT link_click OF cl_salv_events_table
IMPORTING row column.
ENDCLASS. "lcl_event_handler DEFINITION"
CLASS lcl_report DEFINITION.
PUBLIC SECTION.
TYPES: BEGIN OF str_vbak,
vbeln TYPE vbak-vbeln,
erdat TYPE erdat,
auart TYPE auart,
kunnr TYPE kunnr,
check TYPE flag, "Check box"
END OF str_vbak.
DATA: gt_vbak TYPE STANDARD TABLE OF str_vbak.
"ALV reference"
DATA: gr_table TYPE REF TO cl_salv_table.
METHODS:
get_data,
generate_output.
ENDCLASS. "lcl_report DEFINITION"
*----------------------------------------------------------------------*
* CLASS lcl_report IMPLEMENTATION
*----------------------------------------------------------------------*
CLASS lcl_report IMPLEMENTATION.
METHOD get_data.
SELECT vbeln erdat auart kunnr
INTO TABLE gt_vbak
FROM vbak
UP TO 20 ROWS.
ENDMETHOD. "get_data"
METHOD generate_output.
DATA: lv_msg TYPE REF TO cx_salv_msg.
TRY.
cl_salv_table=>factory(
IMPORTING
r_salv_table = gr_table
CHANGING
t_table = gt_vbak ).
CATCH cx_salv_msg INTO lv_msg.
ENDTRY.
DATA: lr_columns TYPE REF TO cl_salv_columns_table.
DATA: lr_column TYPE REF TO cl_salv_column_table.
lr_columns ?= gr_table->get_columns( ).
lr_columns->set_optimize( 'X' ).
"Change the properties of the Columns KUNNR"
TRY.
lr_column ?= lr_columns->get_column( 'CHECK' ).
lr_column->set_cell_type( if_salv_c_cell_type=>checkbox_hotspot ).
lr_column->set_output_length( 10 ).
CATCH cx_salv_not_found. "EC NO_HANDLER"
ENDTRY.
"Get the event object"
DATA: lr_events TYPE REF TO cl_salv_events_table.
lr_events = gr_table->get_event( ).
"Instantiate the event handler object"
DATA: lr_event_handler TYPE REF TO lcl_event_handler.
CREATE OBJECT lr_event_handler.
"Event handler"
SET HANDLER lr_event_handler->on_link_click FOR lr_events.
"Displaying the ALV"
gr_table->display( ).
ENDMETHOD. "generate_output"
ENDCLASS. "lcl_report IMPLEMENTATION"
START-OF-SELECTION.
DATA: lo_report TYPE REF TO lcl_report.
CREATE OBJECT lo_report.
lo_report->get_data( ).
lo_report->generate_output( ).
CLASS lcl_event_handler IMPLEMENTATION.
METHOD on_link_click.
"Get the value of the checkbox and set the value accordingly refersh the table"
FIELD-SYMBOLS: <lfa_data> LIKE LINE OF lo_report->gt_vbak.
READ TABLE lo_report->gt_vbak ASSIGNING <lfa_data> INDEX row.
CHECK sy-subrc IS INITIAL.
IF <lfa_data>-check IS INITIAL.
<lfa_data>-check = 'X'.
ELSE.
CLEAR <lfa_data>-check.
ENDIF.
lo_report->gr_table->refresh( ).
ENDMETHOD. "on_link_click"
ENDCLASS. "lcl_event_handler IMPLEMENTATION"