原文:Small Fire · 报表开发<OO ALV工具> · ABAP 子专栏 · Small Fire 技术笔记
显示后,修改字段目录和布局
在运行期间,可以在首次显示列表后设置新的布局或新字段目录。 这些组件具有 get/set 方法来完成此操作。
Field Catalog
- GET_FRONTEND_FIELDCATALOG
- SET_FRONTEND_FIELDCATALOG
Layout
- GET_FRONTEND_LAYOUT
- SET_FRONTEND_LAYOUT
代码示例
DATA ls_fcat TYPE lvc_s_fcat .
DATA lt_fcat TYPE lvc_t_fcat .
DATA ls_layout TYPE lvc_s_layo .
"Field Cattalog"
CALL METHOD obj_alv->get_frontend_fieldcatalog
IMPORTING
et_fieldcatalog = lt_fcat[] .
LOOP AT lt_fcat INTO ls_fcat .
IF ls_fcat-fieldname = 'Field_name' .
ls_fcat-no_out = space .
MODIFY lt_fcat FROM ls_fcat .
ENDIF .
CLEAR ls_fcat .
ENDLOOP .
CALL METHOD obj_alv->set_frontend_fieldcatalog
EXPORTING
it_fieldcatalog = lt_fcat[] .
"Layout"
CALL METHOD obj_alv->get_frontend_layout
IMPORTING
es_layout = ls_layout .
ls_layout-grid_title = 'Title name' .
CALL METHOD obj_alv->set_frontend_layout
EXPORTING
is_layout = ls_layout .
给ALV对象注册事件
如果我们想处理由 ALV Grid 实例触发的事件,我们应该定义并实现一个事件处理程序类。 创建 ALV Grid 实例后,我们必须注册此事件处理程序类的实例来处理 ALV Grid 事件。
(1) HANDLE_TOOLBAR:这个事件用于给ALV加自定义工具条按钮。
(2) HANDLE_CLICK:用于给ALV点击其中一行后处理代码段。
(3) HANDLE_COMMAND:事件用于接收用户按了自定义按钮后,触发的代码段。
(4) HANDLE_DOUBLE_CLICK:双击事件
(5) DATA_CHANGED:可编辑字段的数据发生变化时触发,可用来检查数据的输入正确性
(6) DATA_CHANGED_FINISHED:当数据修改完成后触发,数据没有被修改,当失去焦点或回车时触发
……
定义事件
CLASS cl_event_receiver DEFINITION.
PUBLIC SECTION.
"声明单击事件的方法"
METHODS handle_hotspot_click
FOR EVENT hotspot_click OF cl_gui_alv_grid
IMPORTING e_row_id e_column_id.
"声明双击事件方法"
METHODS handle_double_click
FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING e_row e_column.
"声明 Toolbar 事件方法"
METHODS handle_toolbar
FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive.
"声明 USER-COMMAND 事件方法"
METHODS handle_command
FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
ENDCLASS. "cl_event_receiver DEFINITION"
事件执行的方法代码
CLASS cl_event_receiver IMPLEMENTATION.
"单击事件方法的实现"
METHOD handle_hotspot_click.
CONDENSE e_row_id NO-GAPS.
CONDENSE e_column_id NO-GAPS.
MESSAGE i001(00) WITH ' 单击事件 -> 行号:' e_row_id '、列名:' e_column_id.
ENDMETHOD. "handle_HOTSPOT_CLICK"
"双击事件方法的实现"
METHOD handle_double_click.
CONDENSE e_row NO-GAPS.
CONDENSE e_column NO-GAPS.
MESSAGE i001(00) WITH ' 双击事件 -> 行号:' e_row '、列名:' e_column.
ENDMETHOD. "handle_double_click"
"实现 Toolbar 事件方法"
METHOD handle_toolbar.
DATA: ls_toolbar TYPE stb_button.
CLEAR: ls_toolbar.
ls_toolbar-butn_type = 3. "分隔符"
APPEND ls_toolbar TO e_object->mt_toolbar.
CLEAR: ls_toolbar.
ls_toolbar-function = 'DISP'. "功能码"
ls_toolbar-icon = icon_display. "图标名称"
ls_toolbar-quickinfo = ' 显示'. "图标的提示信息"
ls_toolbar-butn_type = 0. "0 表示正常按钮"
ls_toolbar-disabled = ''. "X 表示灰色,不可用"
ls_toolbar-text = 'btn1'. "按钮上显示的文本"
APPEND ls_toolbar TO e_object->mt_toolbar.
ENDMETHOD. "handle_toolbar"
"实现 USER-COMMAND 事件方法"
METHOD handle_command.
CASE e_ucomm.
WHEN 'DISP'.
MESSAGE i001(00) WITH 'Toolbar 事件 + USER-COMMAND 事件 '.
ENDCASE.
ENDMETHOD. "HANDLE_COMMAND"
ENDCLASS. "cl_event_receiver IMPLEMENTATION"
注册事件
在创建GRID实例后注册事件:
CREATE OBJECT event_receiver.
"注册事件 handler 方法"
SET HANDLER event_receiver->handle_hotspot_click FOR g_grid01.
SET HANDLER event_receiver->handle_double_click FOR g_grid01.
SET HANDLER event_receiver->handle_toolbar FOR g_grid01.
SET HANDLER event_receiver->handle_command FOR g_grid01.
单元格编辑
设置FIELDCAT的 EDIT 属性。还需要在显示ALV前添加触发数据改变事件:
CALL METHOD ALV_GRID->REGISTER_EDIT_EVENT
EXPORTING
I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVT_MODIFIED. "必须设置一种触发方式"
- 按回车触发:I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVENT_ENTER.
- 单元格失去焦点触发:I_EVENT_ID = CL_GUI_ALV_GRID=>MC_EVENT_MODIFIES.
将字段作为下拉菜单
使用内表存放句柄和对应的值,表类型:“LVC_T_DROP”
内表通过方法" SET_DROP_DOWN_TABLE"