原文:Small Fire · OO ALV 不同Container · ABAP 子专栏 · Small Fire 技术笔记

1.Custom container

自定义容器可以使用类 CL_GUI_CUSTOM_CONTAINER 创建,但它需要一个可以放置它的父容器,或者需要在自定义 Screen 中创建一个自定义控制区域。 这个解决方案主要是我现在开发的应用程序中使用的。 但在一个开发中将自定义容器与其他容器混合使用也很常见。

许多人在包含自定义容器区域的屏幕的 PBO 事件期间创建自定义容器,但您不必这样做。 您也可以在调用屏幕之前创建它,就像在使用 CL_GUI_CUSTOM_CONTAINER 的简单示例中一样,您可以在图 1 和演示程序 ZDEMO_AIN_CL01 中找到它。

不要试图在这个程序中找到任何东西,这不是为了在网格上快速显示数据所需要的。 没有 GUI 状态,没有 PBO 和 PAI 处理。 我故意这样做只是为了创建非常简单的示例。

当然,为了能够显示网格,我必须创建一个 SCREEN 0100,其中包含名为 CC 的自定义容器区域,您可以在图 2 中找到它。我对屏幕所做的唯一附加设置是将其大小设置为 200 x 255 并且我已经提供了垂直和水平调整区域大小的可能性,因此它适合所有屏幕。

REPORT zdemo_ain_c101.
select * up to 50 rows form spfli int table @data(flights).
data(grid) = new cl_gui_alv_grid(
  i_parent = new cl_gui_customg_container( container_name = 'CC' )
).
grid->set_table_for_first_display(
  exporting
    i_structure_name    =   'SPFLI'
  changing
    it_outtab           =    flights
  exceptions
    invalid_parameter_combination = 1
    program_error                 = 2
    too_many_lines                = 3
    others                        = 4
).
IF sy-subrc = 0
  CALL SCREEN 0100.
ENDIF.

2.Splitter container

Splitter Container 可以使用类 CL_GUI_SPLITTER_CONTAINER 创建, 需要一个自定义容器作为父容器才能工作。 它用于将屏幕区域划分为多个容器。

为简化起见,你可以决定拆分器将有多少行和列。 所以它就像一个表格,甚至是 HTML 中的 DIV ,您可以在其中放置您的内容。 您可以创建多级拆分器,因此如果您愿意,可以将区域拆分为两行一列,然后在顶行创建一个拆分器,该拆分器将分为两行三列。 您的想象力、屏幕尺寸和用户体验将提示您在这里进行最佳布局。

程序 ZDEMO_AIN_CL02 中的简单示例将创建一个具有两行一列的拆分器。 此处的 SCREEN 0100 与 ZDEMO_AIN_CL01 中的完全相同。

REPORT zdemo_ain_c102.
select * up to 50 rows form spfli int table @data(flights).
DATA:G_SPLITTER TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
     G_CONTAINER_2000L TYPE REF TO CL_GUI_CONTAINER,
     G_CONTAINER_2000R TYPE REF TO CL_GUI_CONTAINER.
IF g_splitter IS INITIAL.
    CREATE OBJECT g_splitter  "定义一个屏幕包含两个ALV"
      EXPORTING
        parent  = cl_gui_container=>screen0
        rows    = 2
        columns = 1.
    CALL METHOD g_splitter->set_border
      EXPORTING
        border = cl_gui_cfw=>false.
    g_container_2000l = g_splitter->get_container( row = 1 column = 1 ).
    g_container_2000r = g_splitter->get_container( row = 2 column = 1 ).
    g_splitter->set_row_height( id = 1 height = 20 ).
    g_splitter->set_row_height( id = 2 height = 80 ).
ENDIF.
data(grid) = new cl_gui_alv_grid(
  i_parent = g_container_2000l
).
grid->set_table_for_first_display(
  exporting
    i_structure_name    =   'SPFLI'
  changing
    it_outtab           =    flights
  exceptions
    invalid_parameter_combination = 1
    program_error                 = 2
    too_many_lines                = 3
    others                        = 4
).
IF sy-subrc = 0
  CALL SCREEN 0100.
ENDIF.

由于我没有对除行数和列数之外的拆分器进行任何编程,然后它会自动将自定义容器区域拆分为两个相等的部分,在顶行我们将看到网格,在底部将有 一个空的空间,因为我们没有在那里放任何东西。

3.Docking container

Docking Container 可以使用类CL_GUI_DOCKING_CONTAINER创建,不需要任何父级,自定义屏幕上的自定义容器区域也不需要。

创建和显示时,它停靠在屏幕的四个位置之一:顶部-top、底部-bottom、左侧- left、右侧-right。 在大多数情况下,停靠容器用于显示一些导航菜单,但由于可以将其用作网格父级,因此也可以使用它来显示其中一些有限数量的列。

REPORT zdemo_ain_c103.
PARAMETERS: dummy AS CHECKBOX.
AT SELECTION-SCREEN OUTPUT.
  select * up to 50 rows form spfli int table @data(flights).
data(docking) = new cl_gui_docking_container(
  side      = cl_gui_docking_container=>dock_at_left
  extension = 300
  repid     = sy-repid
  dynnr     = sy-dynnr
).
data(grid) = new cl_gui_alv_grid( i_parent = docking ).
grid->set_table_for_first_display(
  exporting
    i_structure_name    =   'SPFLI'
  changing
    it_outtab           =    flights
  exceptions
    invalid_parameter_combination = 1
    program_error                 = 2
    too_many_lines                = 3
    others                        = 4
).
IF sy-subrc = 0
ENDIF.

为了能够在不创建任何屏幕的情况下使用 Docking Container,我只添加了一个虚拟参数,并将创建容器的代码移到了在 SELECTION-SCREEN OUTPUT 事件中。 这样 Docking Container 在程序运行后直接出现。 正如您在图 8 中看到的,网格显示在 SCREEN 的左侧,而在右侧您可以找到虚拟的 PARAMETER。

4.Dialgobox container

对话框容器可以使用类CL_GUI_DIALOGBOX_CONTAINER 创建,如果你需要显示带有网格的弹出窗口,并且不想花时间创建带有自定义控件的屏幕,则该对话框会很有用。

在这种情况下使用它非常方便,但它也有一个限制,即这里没有可用的 GUI 工具栏。

REPORT zdemo_ain_c103.
PARAMETERS: dummy AS CHECKBOX.
AT SELECTION-SCREEN OUTPUT.
  select * up to 50 rows form spfli int table @data(flights).
data(dialog) = new cl_gui_dialogbox_container(
  width  = 400
  height = 200
).
data(grid) = new cl_gui_alv_grid( i_parent = dialog ).
grid->set_table_for_first_display(
  exporting
    i_structure_name    =   'SPFLI'
  changing
    it_outtab           =    flights
  exceptions
    invalid_parameter_combination = 1
    program_error                 = 2
    too_many_lines                = 3
    others                        = 4
).
IF sy-subrc = 0
ENDIF.

执行程序后,你可以找到带有网格的弹出屏幕。 如果需要,可以自由的调整其大小或最小化。