树型结构

来源:互联网 发布:dnf几分钟就网络中断 编辑:程序博客网 时间:2024/04/29 12:21

*&---------------------------------------------------------------------*
*& Modulpool         SAPSIMPLE_TREE_CONTROL_DEMO                       *
*&                                                                     *
*&---------------------------------------------------------------------*
REPORT ZTEST01 MESSAGE-ID TREE_CONTROL_MSG.

INCLUDE ZTEST01TOP.
INCLUDE ZTEST01O01.
INCLUDE ZTEST01I01.
INCLUDE ZTEST01F01.

START-OF-SELECTION.

  CREATE OBJECT G_APPLICATION.
  SET SCREEN 100.


*&---------------------------------------------------------------------*
*&  包括                ZTEST01TOP
*&---------------------------------------------------------------------*
*& Include SIMPLE_TREE_CONTROL_DEMOTOP                                 *
*&                                                                     *
*&---------------------------------------------------------------------*
CLASS LCL_APPLICATION DEFINITION DEFERRED.
CLASS CL_GUI_CFW DEFINITION LOAD.

TYPES: NODE_TABLE_TYPE LIKE STANDARD TABLE OF MTREESNODE
         WITH DEFAULT KEY.

DATA: G_APPLICATION TYPE REF TO LCL_APPLICATION,
      G_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
      G_TREE TYPE REF TO CL_GUI_SIMPLE_TREE,
      G_OK_CODE TYPE SY-UCOMM.

DATA: G_EVENT(30),
      G_NODE_KEY TYPE TV_NODEKEY.

  DATA: NODE_TABLE TYPE NODE_TABLE_TYPE.

CONSTANTS:
      BEGIN OF C_NODEKEY,
        ROOT   TYPE TV_NODEKEY VALUE 'Root',
        CHILD1 TYPE TV_NODEKEY VALUE 'Child1',
        CHILD2 TYPE TV_NODEKEY VALUE 'Child2',
        NEW1   TYPE TV_NODEKEY VALUE 'New1',
        NEW2   TYPE TV_NODEKEY VALUE 'New2',
      END OF C_NODEKEY.


*&---------------------------------------------------------------------*
*&  包括                ZTEST01O01
*&---------------------------------------------------------------------*
*&      Module  STATUS_100  OUTPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE STATUS_100 OUTPUT.

  SET PF-STATUS 'MAIN'.

  IF G_TREE IS INITIAL.
    PERFORM CREATE_AND_INIT_TREE.
    PERFORM CREATE_TREE.
  ENDIF.

ENDMODULE.                 " STATUS_100  OUTPUT
*&---------------------------------------------------------------------*
*&      Form  CREATE_TREE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM CREATE_TREE .

  PERFORM BUILD_NODE_TABLE USING NODE_TABLE.

  CALL METHOD G_TREE->ADD_NODES
    EXPORTING
      TABLE_STRUCTURE_NAME           = 'MTREESNODE'
      NODE_TABLE                     = NODE_TABLE
    EXCEPTIONS
      FAILED                         = 1
      ERROR_IN_NODE_TABLE            = 2
      DP_ERROR                       = 3
      TABLE_STRUCTURE_NAME_NOT_FOUND = 4
      OTHERS                         = 5.

  IF SY-SUBRC <> 0.
    MESSAGE A000.
  ENDIF.

ENDFORM.                    " CREATE_TREE


*&---------------------------------------------------------------------*
*&  包括                ZTEST01I01
*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_100  INPUT
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
MODULE USER_COMMAND_100 INPUT.

  DATA: RETURN_CODE TYPE I.
*** 如果事件是注册的,就必须要用 call method cl_gui_cfw=>DISPATCH
  CALL METHOD CL_GUI_CFW=>DISPATCH
    IMPORTING
      RETURN_CODE = RETURN_CODE.

  IF RETURN_CODE <> CL_GUI_CFW=>RC_NOEVENT.
    CLEAR G_OK_CODE.
    EXIT.
  ENDIF.

  CASE G_OK_CODE.

    WHEN 'BACK'.
      IF NOT G_CUSTOM_CONTAINER IS INITIAL.
        CALL METHOD G_CUSTOM_CONTAINER->FREE
          EXCEPTIONS
            CNTL_SYSTEM_ERROR = 1
            CNTL_ERROR        = 2.
        CLEAR G_CUSTOM_CONTAINER.
        CLEAR G_TREE.
      ENDIF.
      LEAVE PROGRAM.

  ENDCASE.

  CLEAR G_OK_CODE.

ENDMODULE.                 " USER_COMMAND_0100  INPUT

*

*&---------------------------------------------------------------------*
*&  包括                ZTEST01F01
*&---------------------------------------------------------------------*
*   INCLUDE SIMPLE_TREE_CONTROL_DEMOCL1                                *
*----------------------------------------------------------------------*
CLASS LCL_APPLICATION DEFINITION.

  PUBLIC SECTION.
    METHODS:
      HANDLE_NODE_DOUBLE_CLICK
        FOR EVENT NODE_DOUBLE_CLICK
        OF CL_GUI_SIMPLE_TREE
        IMPORTING NODE_KEY.

    METHODS:
      HANDLE_EXPAND_NO_CHILDREN
        FOR EVENT EXPAND_NO_CHILDREN
        OF CL_GUI_SIMPLE_TREE
        IMPORTING NODE_KEY.

ENDCLASS.                    "LCL_APPLICATION DEFINITION
*----------------------------------------------------------------------*
*       CLASS LCL_APPLICATION IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS LCL_APPLICATION IMPLEMENTATION.

** 创建树型控件时,绑定的双击事件
  METHOD  HANDLE_NODE_DOUBLE_CLICK.

    G_EVENT = 'NODE_DOUBLE_CLICK'.
    G_NODE_KEY = NODE_KEY.

  ENDMETHOD.                    "HANDLE_NODE_DOUBLE_CLICK

** 创建树型控件时,绑定的单击结点事件
  METHOD HANDLE_EXPAND_NO_CHILDREN.

    DATA: NODE_TABLE TYPE NODE_TABLE_TYPE,
          NODE TYPE MTREESNODE.

    G_EVENT = 'EXPAND_NO_CHILDREN'.
    G_NODE_KEY = NODE_KEY.

    IF NODE_KEY = 'Child2'.
      CLEAR NODE.
      NODE-NODE_KEY = C_NODEKEY-NEW1.
      NODE-RELATKEY = C_NODEKEY-CHILD2.
      NODE-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
      NODE-ISFOLDER = ' '.
      NODE-TEXT = 'New1'(NE1).
      APPEND NODE TO NODE_TABLE.

      CLEAR NODE.
      NODE-NODE_KEY = C_NODEKEY-NEW2.
      NODE-RELATKEY = C_NODEKEY-CHILD2.
      NODE-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
      NODE-N_IMAGE = '@10@'.
      NODE-EXPANDER = ' '.
      NODE-TEXT = 'New2'(NE2).
      APPEND NODE TO NODE_TABLE.

*** 将数据写进树型控件
      CALL METHOD G_TREE->ADD_NODES
        EXPORTING
          TABLE_STRUCTURE_NAME           = 'MTREESNODE'
          NODE_TABLE                     = NODE_TABLE
        EXCEPTIONS
          FAILED                         = 1
          ERROR_IN_NODE_TABLE            = 2
          DP_ERROR                       = 3
          TABLE_STRUCTURE_NAME_NOT_FOUND = 4
          OTHERS                         = 5.
      IF SY-SUBRC <> 0.
        MESSAGE A000.
      ENDIF.
    ENDIF.
  ENDMETHOD.                    "HANDLE_EXPAND_NO_CHILDREN

ENDCLASS.                    "LCL_APPLICATION IMPLEMENTATION
*&---------------------------------------------------------------------*
*&      Form  CREATE_AND_INIT_TREE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM CREATE_AND_INIT_TREE.

  DATA: EVENTS TYPE CNTL_SIMPLE_EVENTS,
        EVENT TYPE CNTL_SIMPLE_EVENT.

* 为树型控件创建一个容器
  CREATE OBJECT G_CUSTOM_CONTAINER
    EXPORTING
      CONTAINER_NAME              = 'TREE_CONTAINER'
    EXCEPTIONS
      CNTL_ERROR                  = 1
      CNTL_SYSTEM_ERROR           = 2
      CREATE_ERROR                = 3
      LIFETIME_ERROR              = 4
      LIFETIME_DYNPRO_DYNPRO_LINK = 5.
  IF SY-SUBRC <> 0.
    MESSAGE A000.
  ENDIF.

* 创建树型控件 此时没有数据
  CREATE OBJECT G_TREE
    EXPORTING
      PARENT                      = G_CUSTOM_CONTAINER
      NODE_SELECTION_MODE         = CL_GUI_SIMPLE_TREE=>NODE_SEL_MODE_SINGLE
    EXCEPTIONS
      LIFETIME_ERROR              = 1
      CNTL_SYSTEM_ERROR           = 2
      CREATE_ERROR                = 3
      FAILED                      = 4
      ILLEGAL_NODE_SELECTION_MODE = 5.
  IF SY-SUBRC <> 0.
    MESSAGE A000.
  ENDIF.

*** 双击时事件
  EVENT-EVENTID = CL_GUI_SIMPLE_TREE=>EVENTID_NODE_DOUBLE_CLICK.
  EVENT-APPL_EVENT = 'X'.
  APPEND EVENT TO EVENTS.

*** 单击子结点为时事件
  EVENT-EVENTID = CL_GUI_SIMPLE_TREE=>EVENTID_EXPAND_NO_CHILDREN.
  EVENT-APPL_EVENT = 'X'.
  APPEND EVENT TO EVENTS.

*** 注册事情
  CALL METHOD G_TREE->SET_REGISTERED_EVENTS
    EXPORTING
      EVENTS                    = EVENTS
    EXCEPTIONS
      CNTL_ERROR                = 1
      CNTL_SYSTEM_ERROR         = 2
      ILLEGAL_EVENT_COMBINATION = 3.
  IF SY-SUBRC <> 0.
    MESSAGE A000.
  ENDIF.

*** 将事件和树型控件绑定
  SET HANDLER G_APPLICATION->HANDLE_NODE_DOUBLE_CLICK FOR G_TREE.
  SET HANDLER G_APPLICATION->HANDLE_EXPAND_NO_CHILDREN FOR G_TREE.

ENDFORM.                    " CREATE_AND_INIT_TREE
*&---------------------------------------------------------------------*
*&      Form  build_node_table
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM BUILD_NODE_TABLE USING NODE_TABLE TYPE NODE_TABLE_TYPE.

  DATA: NODE LIKE MTREESNODE.

  NODE-NODE_KEY = C_NODEKEY-ROOT.    " 指定最高级的父节点
  CLEAR NODE-RELATKEY.
  CLEAR NODE-RELATSHIP.
  NODE-HIDDEN = ' '.                 " 整个树型结构是否显示
  NODE-DISABLED = 'X'.               " 没测出什么作用
  NODE-ISFOLDER = 'X'.               " 结点的图标为文件夹.
  NODE-TEXT = 'Root'.                " 结点显示的方本
  APPEND NODE TO NODE_TABLE.         " 写进树型结构内表


*    加第一个 一级子结点
  NODE-NODE_KEY = C_NODEKEY-CHILD1.  " 一级子结点
  NODE-RELATKEY = C_NODEKEY-ROOT.    " 指定本级结点的父结点
  NODE-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD. "  没测出作什么用
  NODE-HIDDEN = ' '.
  NODE-DISABLED = ' '.
  NODE-ISFOLDER = 'X'.
  NODE-EXPANDER = 'X'.
  NODE-TEXT = 'Child1'.
  NODE-STYLE = CL_GUI_SIMPLE_TREE=>STYLE_EMPHASIZED_POSITIVE.  "上颜色
  APPEND NODE TO NODE_TABLE.

*    加第二个 一级子结点
  CLEAR NODE-RELATKEY.
  CLEAR NODE-RELATSHIP.
  NODE-NODE_KEY = C_NODEKEY-CHILD2.
  NODE-RELATKEY = C_NODEKEY-ROOT.
  NODE-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
  NODE-HIDDEN = ' '.
  NODE-DISABLED = ' '.
  NODE-ISFOLDER = 'X'.
  NODE-EXPANDER = 'X'.
  NODE-TEXT = 'Child2'.
  NODE-STYLE = CL_GUI_SIMPLE_TREE=>STYLE_EMPHASIZED_POSITIVE.
  APPEND NODE TO NODE_TABLE.

ENDFORM.                    " build_node_table

 

*&---------------------------------------------------------------------*
*&   screen 100
*&---------------------------------------------------------------------*

PROCESS BEFORE OUTPUT.

  MODULE STATUS_100.

PROCESS AFTER INPUT.

  MODULE USER_COMMAND_100.

 

原创粉丝点击