颜色设置一般有单元格、行、列三种,在ALV中的优先级为:单元格 > 行 >列,如果这列被设为KEY,颜色设置就不会起作用,
ls_v_fcat-key = 'X'。
列颜色:
是由fieldcat中的属性控制的, emphasize字段。
行颜色:
是内表字段 和 layout 同时起作用控制,layout-info_fieldname为内表中字段名,然后再内表中定义该字段名的CHAR4类型。
单元格颜色:
是内表中structure结构加上layout同时起作用控制,layout-coltab_fieldname为内表中structure名,然后再在内表中定义slis_t_specialcol_alv / lvc_s_scol 的结构。
可编辑:
可以通过layout-edit控制所有单元格可编辑,但一般没有这种需求,
列可编辑:fieldcat-edit控制。
单元格编辑:
通过内表structure结构和fieldcat和layout的属性控制,fieldcat-edit = 'X',将该列所有单元格改为可编辑,内表中定义lvc_s_styl的字段,然后layout-stylefname为字段名,
FORM inital .
gs_layout-stylefname = 'CELLSTAB'."设置可编辑信息
gt_data-val1 = 'cell1'.
gt_data-val2 = 'cell2'.
gt_cellstab-fieldname = 'VAL1'.
"将原本可编辑的单元格切换到不可编辑样式。注:这里
"只是样式的切换,不能仅仅使用cl_gui_alv_grid=>mc_style_enabled来将单元格设置为
"可编辑状态,单元格真正是否可编辑是由fieldcat-edit或layout-edit来决定的,而仅
"设置为cl_gui_alv_grid=>mc_style_enabled是不可编辑的
gt_cellstab-style = cl_gui_alv_grid=>mc_style_disabled.
APPEND gt_cellstab.
gt_data-cellstab = gt_cellstab[].
APPEND gt_data.
ENDFORM.
单元格数据修改立即同步:(触发DATA_CHANGED事件)失去焦点或者回车后会立即同步到内表,如果没有设置这个,则需要双击、刷新才会触发DATA_CHANGED事件。
两种方法:i_grid_settings-edt_cll_cb设置;在user_command回调的form中处理,
FORM user_command USING ucomm LIKE sy-ucommselfield selfield TYPE slis_selfield.
DATA l_ref1 TYPE REF TO cl_gui_alv_grid.
CALL FUNCTION 'GET_GLOBALS_FROM_SLVC_FULLSCR'
IMPORTING
e_grid = l_ref1.
CALL METHOD l_ref1->check_changed_data. "调用此方法后会触发DATA_CHANGED事件。当此方法执行完后,被修改的数据就会更新到输出内表中了
"好像没有上面几行代码,只需下面一行也可以自动更新,上面代码究竟有什么作用?
selfield-refresh = 'X'.
CASE ucomm.
WHEN 'UPDATE'.
PERFORM frm_update.
ENDCASE.
ENDFORM.
如果需要在更改内表内容之前做数据有效性验证,则需要下面:
DATA: t_events TYPE slis_t_event WITH HEADER LINE.
t_events-name = slis_ev_data_changed.
t_events-form = 'ALV_DATA_CHANGED'.
APPEND t_events.
"注:如果没有设置 i_grid_settings-edt_cll_cb = 'X',在单元格数据被
"修改后,此Form不会自动调用,直到点击了 保存或刷新 按钮后才会被调用
"另外 cl_gui_alv_grid 的CHECK_CHANGED_DATA方法也会触发 data_changed事件
FORM alv_data_changed USING pel_data TYPE REF TO cl_alv_changed_data_protocol.
DATA: l_name(20),ls_cells TYPE lvc_s_modi.
FIELD-SYMBOLS <fs_value>.
LOOP AT pel_data->mt_mod_cells INTO ls_cells.
CLEAR gt_data.
READ TABLE gt_data INDEX ls_cells-row_id.
CONCATENATE 'GT_DATA-' ls_cells-fieldname INTO l_name.
ASSIGN (l_name) TO <fs_value>.
<fs_value> = ls_cells-value.
"实际上不需要此句来修改输出内表中的数据,因为只要在该Form中不
"弹出 E MSG,则该Form执行完后会也会自动更新输出内表
"MODIFY gt_data INDEX ls_cells-row_id.
ENDLOOP.
ENDFORM.
Function ALV函數中獲取生成OO ALV對象,有時候函數不能满足我们的需求,比如:设置单元格为pushbutton时,没有办法相应事件,所以只能借助OO ALV对象。