效果:
代码:
DATA:BEGIN OF GS_DATA.
INCLUDE STRUCTURE SPFLI.
DATA: CELL_STYLE TYPE LVC_T_STYL, "为内表添加设置编辑状态所需的字段
END OF GS_DATA.
"alv数据变量
DATA: LT_DATA LIKE TABLE OF GS_DATA.
DATA: LW_DATA LIKE LINE OF LT_DATA.
"alv变量
DATA:
LT_FIELDCAT TYPE LVC_T_FCAT , "显示数据列内表
LW_FIELDCAT LIKE LINE OF LT_FIELDCAT, "显示数据列内表工作区域
L_LAYOUT TYPE LVC_S_LAYO.
DATA: LW_STYLELIN TYPE LVC_S_STYL.
FIELD-SYMBOLS <L_DATA> LIKE LINE OF LT_DATA.
DEFINE MAC_FIELDLOG.
LW_FIELDCAT-FIELDNAME = &1 . "字段名称
LW_FIELDCAT-REPTEXT = &2. "标题
* "设置复选框可编辑
IF &1 EQ 'CARRID'.
LW_FIELDCAT-EDIT = 'X'.
ENDIF.
APPEND LW_FIELDCAT TO LT_FIELDCAT.
CLEAR LW_FIELDCAT.
END-OF-DEFINITION.
START-OF-SELECTION.
SELECT * FROM SPFLI INTO CORRESPONDING FIELDS OF TABLE LT_DATA.
MAC_FIELDLOG:
'CARRID ' '航线承运人ID ',
'CONNID ' '航班连接 Id ',
'COUNTRYFR ' '国家键值 ',
'CITYFROM ' '起飞城市 ',
'AIRPFROM ' '起飞机场 '.
LOOP AT LT_DATA ASSIGNING <L_DATA> .
LW_STYLELIN-FIELDNAME = 'CARRID'. " 需要编辑的列名
IF <L_DATA>-CARRID = 'AA'.
* LW_STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. " 设置为可编辑状态
ELSE.
LW_STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. " 设置为可编辑状态
ENDIF.
APPEND LW_STYLELIN TO <L_DATA>-CELL_STYLE.
CLEAR LW_STYLELIN.
ENDLOOP.
L_LAYOUT-STYLEFNAME = 'CELL_STYLE'. " 将内表中的字段名存入显示格式
CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY_LVC'"调用函数
EXPORTING
IT_FIELDCAT_LVC = LT_FIELDCAT
IS_LAYOUT_LVC = L_LAYOUT
TABLES
T_OUTTAB = LT_DATA
EXCEPTIONS
PROGRAM_ERROR = 1
OTHERS = 2.
IF SY-SUBRC <> 0.
* Implement suitable error handling here
ENDIF.
这里说明下:
我最开始的时候,没有加下面这句话
* "设置复选框可编辑
IF &1 EQ 'CARRID'.
LW_FIELDCAT-EDIT = 'X'.
ENDIF.而是直接使用的
IF -CARRID = 'AA'.
LW_STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. " 设置为可编辑状态
ELSE.
LW_STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED. " 设置为可编辑状态
ENDIF.
发现没起到作用,所有单元格都是不可编辑的
应该是 LW_STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_ENABLED. " 设置为可编辑状态
这句话没起到作用。
具体我没有细研究。
目前测试,把
IF &1 EQ 'CARRID'.
LW_FIELDCAT-EDIT = 'X'.
ENDIF.
让该列所有单元格可编辑,然后使用
LW_STYLELIN-STYLE = CL_GUI_ALV_GRID=>MC_STYLE_DISABLED.
是可以控制不需要编辑的。
这种是可以实现的。