导读:接上一文章:
SAP ABAP之BOM物料递归查询方法汇总以及树状TREE ALV展示BOM物料层级
在此基础上,再加上表头数据说明,查阅了很多相关资料,发现网上并没有这一教程,都是基于
alv grid
去实现的
top_of_page
,没有基于
alv tree
去实现
top_of_page
的案例。所以在此记录一下我的实现过程。
先来说一下思路:
其实alv tree 与 alv grid实现TOP_OF_PAGE的思路是一致的,都是
-
第一:先分割设置好容器;(
因为表头需要单独一个容器,所以此处需要分割成两个,自定义两个容器也行,或者用docking加上splitter容器进行切割也行,这里的例子用docking实现
) - 第二:声明事件类;
- 第三注册事件类;
主要是上面三个步骤。
废话不多说,直接上实例代码
先声明此例程需要用到的全局参数
DATA: tree1 TYPE REF TO cl_gui_alv_tree. "树控件
DATA:go_docking TYPE REF TO cl_gui_docking_container, "全屏自适应
go_split_container1 TYPE REF TO cl_gui_splitter_container, "控件拆分
go_split_container2 TYPE REF TO cl_gui_splitter_container, "控件拆分
go_container1 TYPE REF TO cl_gui_container,"表头容器
go_container2 TYPE REF TO cl_gui_container."表体数据容器
DATA: go_dyndoc_id TYPE REF TO cl_dd_document, "文档
go_html_cntrl TYPE REF TO cl_gui_html_viewer. "HTML CONTRL PROXY CLASS
第一步,容器拆分以及分配容器:
* 创建docking容器
CREATE OBJECT go_docking
EXPORTING
repid = sy-repid
dynnr = sy-dynnr
side = cl_gui_docking_container=>dock_at_bottom "dock_at_top
extension = 99999
EXCEPTIONS
cntl_error = 1
cntl_system_error = 2
create_error = 3
lifetime_error = 4
lifetime_dynpro_dynpro_link = 5
OTHERS = 6.
"将容器分为两行一列
CREATE OBJECT go_split_container1
EXPORTING
link_dynnr = sy-dynnr
link_repid = sy-repid
parent = go_docking
rows = 2 "分成一行
columns = 1. "分成两列
"分配容器
CALL METHOD go_split_container1->get_container "表头
EXPORTING
row = 1
column = 1
RECEIVING
container = go_container1.
* 创建文档对象
CREATE OBJECT go_dyndoc_id
EXPORTING
style = 'ALV_GRID'.
* 分配容器
CALL METHOD go_split_container1->get_container "表体(树)
EXPORTING
row = 2
column = 1
RECEIVING
container = go_container2.
* 设置第一个容器的高度(表头)
CALL METHOD go_split_container1->set_row_height
EXPORTING
id = 1
height = 20.
* 创建tree1控件对象
CREATE OBJECT tree1
EXPORTING
parent = go_container2
node_selection_mode = cl_gui_column_tree=>node_sel_mode_single
item_selection = 'X'
no_html_header = 'X'
no_toolbar = ' '.
第二步:声明事件类:
"tree alv事件声明
CLASS cl_alv_tree_event DEFINITION.
PUBLIC SECTION.
"声明top_of_page事件
METHODS: top_of_page FOR EVENT top_of_page OF cl_gui_alv_tree..
ENDCLASS.
"tree alv事件实施
CLASS cl_alv_tree_event IMPLEMENTATION.
"实施top_of_page事件
METHOD top_of_page.
PERFORM top_of_page.
ENDMETHOD.
ENDCLASS.
"定义事件对象
DATA:go_event_9000 TYPE REF TO cl_alv_tree_event.
第三步:将事件类实例化并注册到tree控件中
"注册事件
CREATE OBJECT go_event_9000.
SET HANDLER go_event_9000->top_of_page FOR tree1.
CALL METHOD tree1->top_of_page_event.
初始化文档对象:
*初始化
CALL METHOD go_dyndoc_id->initialize_document
EXPORTING
background_color = cl_dd_area=>col_textarea.
FORM :TOP_OF_PAGE
FORM top_of_page.
DATA:dl_text(255) TYPE c.
* 文本
CLEAR dl_text.
CALL METHOD go_dyndoc_id->add_text
EXPORTING
text = 'TOP_OF_PAGE'
sap_style = cl_dd_area=>heading
sap_fontsize = cl_dd_area=>small
sap_color = cl_dd_area=>list_heading_int.
IF go_html_cntrl IS INITIAL.
CREATE OBJECT go_html_cntrl
EXPORTING
parent = go_container1.
ENDIF.
CALL METHOD go_dyndoc_id->merge_document.
go_dyndoc_id->html_control = go_html_cntrl.
CALL METHOD go_dyndoc_id->display_document
EXPORTING
reuse_control = 'X'
parent = go_container1
EXCEPTIONS
html_display_error = 1.
ENDFORM.
注意:
实现第三步时,不像alv tree注册其他类似双击事件一样需要调用
tree1->set_registered_events
这里的
tree1->top_of_page_event.
的意思其实和set_registered_events意思是一样的,都是向tree控件注册事件,所以此处不再使用set_registered_events(这个事件注册也不能注册TOP_OF_PAGE事件),而是选择了
top_of_page_event
方式向tree注册事件。
到此,完成!
如有疑问,欢迎留言,定当知无不言~