ALV (四)、 Function ALV (颜色,编辑)

颜色设置一般有单元格、行、列三种,在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对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值