1.Custom container

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

许多人在包含自定义容器区域的屏幕的 PBO 事件期间创建自定义容器,但是也可以不这样做。 也可以在调用屏幕之前创建它。

为了能够显示 ALV Grid,必须创建一个 SCREEN ,在屏幕中创建自定义容器区域。将屏幕大小设置为 200 x 255 并且提供了垂直和水平调整区域大小的可能性,这样它可以适合所有屏幕。

REPORT ZDEMO_CUSTOM_CONTAINER.
DATA: flights TYPE TABLE OF spfli.
DATA: go_grid TYPE REF TO cl_gui_alv_grid.
select * up to 50 rows from spfli into table flights.
go_grid = new cl_gui_alv_grid(
  i_parent = new cl_gui_customg_container( container_name = 'CC' )
).
go_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_SPLITTER_CONTAINER 中的简单示例将创建一个具有两行一列的拆分器。 此处的 SCREEN 0100 与 ZDEMO_CUSTOM_CONTAINER 中的完全相同。

REPORT ZDEMO_SPLITTER_CONTAINER.
DATA: flights TYPE TABLE OF spfli.
DATA: go_grid TYPE REF TO cl_gui_alv_grid.
select * up to 50 rows from spfli into table flights.
DATA:go_splitter TYPE REF TO CL_GUI_SPLITTER_CONTAINER,
     go_container_2000l TYPE REF TO CL_GUI_CONTAINER,
     go_container_2000r TYPE REF TO CL_GUI_CONTAINER.
IF go_splitter IS INITIAL.
    CREATE OBJECT go_splitter  "定义一个屏幕包含两个ALV"
      EXPORTING
        parent  = cl_gui_container=>screen0
        rows    = 2
        columns = 1.
    CALL METHOD go_splitter->set_border
      EXPORTING
        border = cl_gui_cfw=>false.
    go_container_2000l = go_splitter->get_container( row = 1 column = 1 ).
    go_container_2000r = go_splitter->get_container( row = 2 column = 1 ).
    go_splitter->set_row_height( id = 1 height = 20 ).
    go_splitter->set_row_height( id = 2 height = 80 ).
ENDIF.
IF go_grid IS INITIAL.
  go_grid = new cl_gui_alv_grid(
    i_parent = go_container_2000l
  ).
ENDIF.
go_grid->set_table_for_first_display(
  exporting
    i_structure_name    =  'SPFLI'
    i_save              =  'X'
  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)。 在大多数情况下,Docking 容器用于显示一些导航菜单,但由于可以将其用作网格父级,因此也可以使用它来显示其中一些有限数量的列。

REPORT ZDEMO_DOCKING_CONTAINER.
PARAMETERS: dummy AS CHECKBOX.
DATA: flights TYPE TABLE OF spfli.
DATA: go_docking TYPE REF TO cl_gui_docking_container.
DATA: go_grid TYPE REF TO cl_gui_alv_grid.
AT SELECTION-SCREEN OUTPUT.
  select * up to 50 rows form spfli into table flights.
  go_docking = new cl_gui_docking_container(
    side      = cl_gui_docking_container=>dock_at_left
    extension = 300
    repid     = sy-repid
    dynnr     = sy-dynnr
  ).
  go_grid = new cl_gui_alv_grid( i_parent = go_docking ).
  go_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 在程序运行后直接出现。

4.Dialgobox container

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

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

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

REPORT ZDEMO_DIALOGBOX_CONTAINER.
PARAMETERS: dummy AS CHECKBOX.
DATA: flights TYPE TABLE OF spfli.
DATA: go_dialog TYPE REF TO cl_gui_dialogbox_container.
DATA: go_grid TYPE REF TO cl_gui_alv_grid.
AT SELECTION-SCREEN OUTPUT.
  select * up to 50 rows from spfli into table flights.
  go_dialog = new cl_gui_dialogbox_container(
    width  = 400
    height = 200
  ).
  go_grid = new cl_gui_alv_grid( i_parent = dialog ).
  go_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.