使用CL_GUI_ALV_GRID默认容器实现超长换行表头的方法
问题:CL_GUI_ALV_GRID默认容器下设置超长换行表头
在使用默认容器的CL_GUI_ALV_GRID时,通过布局结构
LVC_S_LAYO的GRID_TITLE参数最多只能设置70个字符,现在需要支持更长的字符数且允许换行。当前报表先显示选择屏幕,最终展示带数据的ALV-Grid,但表头长度受限。
解决方案:自定义容器替代默认容器
默认容器的ALV表头是控件自带的,硬限制70字符。改用自定义容器后,可在容器上方添加独立文本控件实现超长换行表头,这是最稳定可靠的方案。
实现步骤
- 创建自定义屏幕(示例中为屏幕2000),添加自定义容器(命名为
CC_ALV) - 在代码中实例化文本控件(推荐用
CL_GUI_TEXT_EDIT,对超长文本和换行支持更好),设置不可编辑、自动换行属性 - 将文本控件和ALV控件依次添加到自定义容器的布局管理器中,分配各自高度
- 实例化ALV时指定自定义容器为父容器,不再使用
LVC_S_LAYO的GRID_TITLE参数
修改后的完整代码示例
REPORT ZTEST. *...Tabellen Implementierung TABLES: p0001, sscrfields. INCLUDE <icon>. DATA: go_alv_grid TYPE REF TO cl_gui_alv_grid, go_container TYPE REF TO cl_gui_custom_container, go_text_head TYPE REF TO cl_gui_text_edit. DATA: gt_celltab TYPE lvc_t_styl, gt_fieldcatalog TYPE lvc_t_fcat. DATA: BEGIN OF gt_data OCCURS 0. INCLUDE STRUCTURE z96_py_iks_1_2. DATA: celltab TYPE lvc_t_styl. DATA: changed TYPE os_boolean, enabled TYPE os_boolean, test TYPE string. DATA: END OF gt_data. DATA: gv_screen_status TYPE string VALUE 'INIT'. SELECTION-SCREEN BEGIN OF BLOCK selection WITH FRAME TITLE TEXT-s01. PARAMETERS: p_month TYPE ziks_month DEFAULT sy-datum+4(2), p_year TYPE ziks_year DEFAULT sy-datum+0(4). SELECT-OPTIONS: so_bukrs FOR p0001-bukrs, so_persk FOR p0001-persk, so_sacha FOR p0001-sacha. SELECTION-SCREEN END OF BLOCK selection. * 自定义屏幕:添加自定义容器CC_ALV SELECTION-SCREEN BEGIN OF SCREEN 2000. CONTROL CC_ALV TYPE CNTL_AREA. SELECTION-SCREEN END OF SCREEN 2000. INITIALIZATION. AT SELECTION-SCREEN. AT SELECTION-SCREEN OUTPUT. IF gv_screen_status = 'IN_SELECTION'. * 数据读取 SELECT * FROM z96_py_iks_1_2 INTO CORRESPONDING FIELDS OF TABLE gt_data WHERE audit_month = p_month AND audit_year = p_year AND bukrs IN so_bukrs AND persk IN so_persk AND sacha IN so_sacha. * 创建自定义容器 CREATE OBJECT go_container EXPORTING container_name = 'CC_ALV'. * 创建并配置表头文本控件 CREATE OBJECT go_text_head EXPORTING parent = go_container. * 设置超长换行表头内容 DATA(lv_long_title) = '这是一个支持多行显示的超长ALV表头,可包含超过70个字符的详细信息,比如报表用途、当前筛选条件、统计说明等,完全不受原参数的字符限制,会根据设置的宽度自动换行'. CALL METHOD go_text_head->set_text_as_r3table EXPORTING table = VALUE #( ( lv_long_title ) ). * 设置文本不可编辑、自动换行 CALL METHOD go_text_head->set_readonly_mode EXPORTING readonly_mode = abap_true. CALL METHOD go_text_head->set_wordwrap_mode EXPORTING wordwrap_mode = cl_gui_text_edit=>wordwrap_at_fixed_position fixed_position = 80. " 自定义换行宽度 * 布局管理器:分配表头和ALV的高度占比 DATA(lo_layout) = go_container->get_layout_manager( ). CALL METHOD lo_layout->add_control EXPORTING control = go_text_head width = 100 height = 3. " 表头高度(按百分比分配) * 实例化ALV到自定义容器 CREATE OBJECT go_alv_grid EXPORTING i_parent = go_container i_appl_events = abap_true. * ALV布局设置(不再使用GRID_TITLE) DATA(ls_layout) = VALUE lvc_s_layo( stylefname = 'CELLTAB' * zebra = abap_true * cwidth_opt = 'X' ). * 通过SALV生成字段目录 DATA: lo_salv TYPE REF TO cl_salv_table. cl_salv_table=>factory( IMPORTING r_salv_table = lo_salv CHANGING t_table = gt_data[] ). gt_fieldcatalog = cl_salv_controller_metadata=>get_lvc_fieldcatalog( r_columns = lo_salv->get_columns( ) r_aggregations = lo_salv->get_aggregations( ) ). * 显示ALV go_alv_grid->set_table_for_first_display( EXPORTING i_bypassing_buffer = abap_false i_save = 'A' is_layout = ls_layout CHANGING it_fieldcatalog = gt_fieldcatalog it_outtab = gt_data[] ). * 分配ALV控件高度 CALL METHOD lo_layout->add_control EXPORTING control = go_alv_grid width = 100 height = 97. * 移除不需要的工具栏按钮 DATA: it_exclude_btn TYPE STANDARD TABLE OF rsexfcode WITH DEFAULT KEY. it_exclude_btn = VALUE #( ( fcode = 'ONLI' ) ( fcode = 'DYNS' ) ( fcode = 'SPOS' ) ). CALL FUNCTION 'RS_SET_SELSCREEN_STATUS' EXPORTING p_status = '%_00' TABLES p_exclude = it_exclude_btn. * 隐藏默认工具栏 cl_abap_list_layout=>suppress_toolbar( ). * 设置ALV焦点 cl_gui_alv_grid=>set_focus( control = go_alv_grid ). * 更新屏幕状态标记 gv_screen_status = 'IN_ALV'. ENDIF. START-OF-SELECTION. gv_screen_status = 'IN_SELECTION'. CALL SELECTION-SCREEN 2000.
注意事项
- 可根据实际需求调整文本控件的
fixed_position参数,控制换行宽度 - 如果仅需简单文本显示,也可替换为
CL_GUI_LABEL控件,但CL_GUI_TEXT_EDIT对超长文本适配更优 - 自定义容器的高度分配可根据表头内容长度调整
height参数(百分比值)
内容的提问来源于stack exchange,提问作者Andre Matjasic
相关产品推荐
相关产品推荐

