ABAP Tree Control的使用

Tree Control是最常用的Windows控件之一,在其他语言中,称为“Tree View”等,ABAP的Tree Control能完成相似的功能,本章主要介绍以下实例:
(1)实现一个简单的Tree Control;
(2)建立有数据表接口的Tree Control对象;
(3)通过右键菜单完成Tree Control节点的增删修改等功能;
(4)Tree Control对象与ALV Grid对象关联,实现在双击Tree节点时,变更ALV Grid的显示。

1.简单的Tree Control实例

本例将实现以下功能:
(1)建立一个以国家、城市、城区三层的Tree Control对象(固定数据);

(2)当双击某个节点时,在文本框显示选中节点的KEY值和文本值。

REPORT YHELLOA.

DATA: OK_CODE TYPE SY-UCOMM,
      SAVE_OK TYPE SY-UCOMM.

*定制对象
DATA:WA_CONTAINER TYPE SCRFNAME VALUE 'TREE',
*客户对象
      WA_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
      WA_TREE TYPE REF TO CL_GUI_SIMPLE_TREE.
*NODE节点表
DATA:NODE_TABLE LIKE TABLE OF MTREESNODE,
*节点 
    NODE1 TYPE MTREESNODE.
*定义内表,变了需要传递,不加HEADE LINE.
DATA WA_SPFLI LIKE TABLE OF SPFLI.
*当双击时取得节点key值与节点文本值变量
DATA:NODEKEY(200) VALUE 'NODE',NODETEXT(200) VALUE 'NODE'.
*定义对象,定义对象,定义对象的双击方法,用于将该对象双击方法分配到树双击事件
CLASS LCL_APPLICATION DEFINITION DEFERRED.

CLASS LCL_APPLICATION DEFINITION.
  PUBLIC SECTION.
*自定义双击方法,参数为节点关键字
  METHODS HANDLE_NODE_DOUBLE_CLICK
    FOR EVENT NODE_DOUBLE_CLICK
    OF CL_GUI_SIMPLE_TREE
    IMPORTING NODE_KEY.
ENDCLASS.

CLASS LCL_APPLICATION IMPLEMENTATION.
  METHOD HANDLE_NODE_DOUBLE_CLICK.
    NODEKEY = NODE_KEY.
    READ TABLE NODE_TABLE WITH KEY NODE_KEY = NODE_KEY INTO NODE1.
    NODETEXT = NODE1-TEXT.
  ENDMETHOD.
ENDCLASS.

*自定义对象实例
DATA:G_APPLICATION TYPE REF TO LCL_APPLICATION.
START-OF-SELECTION.
  CREATE OBJECT G_APPLICATION.
  CALL SCREEN 100.

MODULE STATUS_0100 OUTPUT.
  IF WA_CUSTOM_CONTAINER IS INITIAL.
    PERFORM CREATE_TREE.
    ENDIF.
ENDMODULE.

MODULE USER_COMMAND_0100 INPUT.
  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.
  CASE SAVE_OK.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.

FORM CREATE_TREE.
*事件内表及单个对象事件。
  DATA:EVENTS TYPE CNTL_SIMPLE_EVENTS,
        EVENT1 TYPE CNTL_SIMPLE_EVENT.
*建立定制控制对象
  CREATE OBJECT WA_CUSTOM_CONTAINER
    EXPORTING
      CONTAINER_NAME = WA_CONTAINER.
*建立树对象
  CREATE OBJECT WA_TREE
    EXPORTING
      PARENT = WA_CUSTOM_CONTAINER
     NODE_SELECTION_MODE = CL_GUI_SIMPLE_TREE=>NODE_SEL_MODE_SINGLE.
  IF SY-SUBRC <> 0.
  ENDIF.
*开始建立以国家、城市、城区三层的树
  CLEAR NODE1.
*节点关键字
  NODE1-NODE_KEY = 'CHINA'.
*第一层
  CLEAR NODE1-RELATKEY.
  CLEAR NODE1-RELATSHIP.
*是文件夹
  NODE1-HIDDEN = ''.
  NODE1-DISABLED = ''.
  NODE1-ISFOLDER = 'X'.
*不带ICON
  CLEAR NODE1-N_IMAGE.
  CLEAR NODE1-EXP_IMAGE.
  CLEAR NODE1-EXPANDER.
  
  NODE1-TEXT = '中国'.
  APPEND NODE1 TO NODE_TABLE.

*二层节点
CLEAR NODE1.
NODE1-NODE_KEY = 'CQ'.
*上层关系
NODE1-RELATKEY = 'CHINA'.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = 'X'.
CLEAR NODE1-N_IMAGE.
CLEAR NODE1-EXP_IMAGE.
CLEAR NODE1-EXPANDER.
NODE1-TEXT = '重庆'.
APPEND NODE1 TO NODE_TABLE.

CLEAR NODE1.
NODE1-NODE_KEY = 'SH'.
NODE1-RELATKEY = 'CHINA'.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = 'X'.
CLEAR NODE1-N_IMAGE.
CLEAR NODE1-EXP_IMAGE.
CLEAR NODE1-EXPANDER.
NODE1-TEXT = '上海'.
APPEND NODE1 TO NODE_TABLE.

*三层节点
CLEAR NODE1.
NODE1-NODE_KEY = 'NP'.
NODE1-RELATKEY = 'CQ'.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = ''.
*图标,可运行SHOWICON查阅
NODE1-N_IMAGE = '@9Y@'.
NODE1-EXP_IMAGE = '@9Y@'.
CLEAR NODE1-EXPANDER.
NODE1-TEXT = '南坪'.
APPEND NODE1 TO NODE_TABLE.

CLEAR NODE1.
NODE1-NODE_KEY = 'SPB'.
NODE1-RELATKEY = 'CQ'.
NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
NODE1-HIDDEN = ''.
NODE1-DISABLED = ''.
NODE1-ISFOLDER = ''.
NODE1-N_IMAGE = '@9Y@'.
NODE1-EXP_IMAGE = '@9Y@'.
CLEAR NODE1-EXPANDER.
NODE1-TEXT = '沙坪坝'.
APPEND NODE1 TO NODE_TABLE.

*搜索节点内容添加节点
CALL METHOD WA_TREE->ADD_NODES
  EXPORTING
      TABLE_STRUCTURE_NAME = 'MTREESNODE'
      NODE_TABLE = NODE_TABLE.

IF SY-SUBRC <> 0.
ENDIF.

*定义双击事件
EVENT1-EVENTID = CL_GUI_SIMPLE_TREE=>EVENTID_NODE_DOUBLE_CLICK.
EVENT1-APPL_EVENT = 'X'.
APPEND EVENT1 TO EVENTS.

*添加事件内表
CALL METHOD WA_TREE->SET_REGISTERED_EVENTS
  EXPORTING
    EVENTS = EVENTS.
IF SY-SUBRC <> 0.
ENDIF.

*将已定义的事件内表分配至树对象
SET HANDLER G_APPLICATION->HANDLE_NODE_DOUBLE_CLICK FOR WA_TREE.
ENDFORM.

 

2.建立有数据表借口的Tree Control对象

先从数据表读取结构,并按照数据关系建立Tree Control

以航班表为例,以“起飞国家-->航班承运人-->航班连接”三层组成。

REPORT YHELLOA.

DATA: OK_CODE TYPE SY-UCOMM,
      SAVE_OK TYPE SY-UCOMM.
*定制对象
DATA: WA_CONTAINER TYPE SCRFNAME VALUE 'TREE',
*客户对象
      WA_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
      WA_TREE TYPE REF TO CL_GUI_SIMPLE_TREE.
*NODE节点表
DATA: NODE_TABLE LIKE TABLE OF MTREESNODE,
*节点
      NODE1 TYPE MTREESNODE.

DATA WA_SPFLI TYPE TABLE OF SPFLI WITH HEADER LINE.

START-OF-SELECTION.
  SELECT * INTO TABLE WA_SPFLI FROM SPFLI
    ORDER BY COUNTRYFR CARRID CONNID ASCENDING.

    SET SCREEN 100.

MODULE STATUS_0100 OUTPUT.
  IF WA_CUSTOM_CONTAINER IS INITIAL.
    PERFORM CREATE_TREE.
  ENDIF.
ENDMODULE.

MODULE USER_COMMAND_0100 INPUT.
  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.
  CASE SAVE_OK.
    WHEN 'EXIT'.
      LEAVE TO SCREEN 0.
  ENDCASE.
ENDMODULE.

FORM CREATE_TREE.
*建立定制控制对象
  CREATE OBJECT WA_CUSTOM_CONTAINER
    EXPORTING
      CONTAINER_NAME = WA_CONTAINER.
*建立树对象
  CREATE OBJECT WA_TREE
    EXPORTING
      PARENT = WA_CUSTOM_CONTAINER
      NODE_SELECTION_MODE = CL_GUI_SIMPLE_TREE=>NODE_SEL_MODE_SINGLE.

  IF SY-SUBRC <> 0.
  ENDIF.

  DATA: COUNTRYFR LIKE SPFLI-COUNTRYFR,
        CARRID LIKE SPFLI-CARRID.

  DATA:STR1(255).

  LOOP AT WA_SPFLI.
    IF COUNTRYFR NE WA_SPFLI-COUNTRYFR.
      CLEAR NODE1.
      NODE1-NODE_KEY = WA_SPFLI-COUNTRYFR.
*第一层
      CLEAR NODE1-RELATKEY.
      CLEAR NODE1-RELATSHIP.
*是文件夹
      NODE1-HIDDEN = ''.
      NODE1-DISABLED = ''.
      NODE1-ISFOLDER = 'X'.
*不带ICON
      CLEAR NODE1-N_IMAGE.
      CLEAR NODE1-EXP_IMAGE.
      CLEAR NODE1-EXPANDER.

      NODE1-TEXT = WA_SPFLI-COUNTRYFR.
      APPEND NODE1 TO NODE_TABLE.
    ENDIF.

    IF ( COUNTRYFR NE WA_SPFLI-COUNTRYFR ) OR ( CARRID <> WA_SPFLI-CARRID ).
      CLEAR NODE1.
      CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID INTO NODE1-NODE_KEY.
*上层关系
      NODE1-RELATKEY = WA_SPFLI-COUNTRYFR.
      NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
      NODE1-HIDDEN = ''.
      NODE1-DISABLED = ''.
      NODE1-ISFOLDER = 'X'.
      CLEAR NODE1-N_IMAGE.
      CLEAR NODE1-EXP_IMAGE.
      CLEAR NODE1-EXPANDER.
*节点显示CARRID
      NODE1-TEXT = WA_SPFLI-CARRID.
      APPEND NODE1 TO NODE_TABLE.
    ENDIF.

    COUNTRYFR = WA_SPFLI-COUNTRYFR.
    CARRID = WA_SPFLI-CARRID.
    CLEAR NODE1.
    CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID
          WA_SPFLI-CONNID INTO NODE1-NODE_KEY.

    CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID INTO STR1.
    NODE1-RELATKEY = STR1.
    NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
    NODE1-HIDDEN = ''.
    NODE1-DISABLED = ''.
    NODE1-ISFOLDER = 'X'.
    NODE1-N_IMAGE = '@5B@'.
    NODE1-EXP_IMAGE = '@5B@'.
    CLEAR NODE1-EXPANDER.
    CONCATENATE WA_SPFLI-CARRID ':' WA_SPFLI-CITYFROM INTO STR1.
    NODE1-TEXT = STR1.
    APPEND NODE1 TO NODE_TABLE.
  ENDLOOP.

*按照节点内容添加节点
  CALL METHOD WA_TREE->ADD_NODES
    EXPORTING
      TABLE_STRUCTURE_NAME = 'MTREESNODE'
      NODE_TABLE = NODE_TABLE.
  IF SY-SUBRC <> 0.
  ENDIF.
ENDFORM.

3.通过右键菜单完成Tree Control节点的增删改功能

 


REPORT YHELLOA.

DATA: ok_code TYPE sy-ucomm,
      save_ok TYPE sy-ucomm.

DATA: wa_container TYPE scrfname VALUE 'TREE',
      wa_custom_container TYPE REF TO cl_gui_custom_container,
      wa_tree TYPE REF TO cl_gui_simple_tree.

DATA: node_table LIKE TABLE OF mtreesnode,
      anode_table LIKE TABLE OF mtreesnode,
      node1 TYPE mtreesnode,
      node2 TYPE mtreesnode.

DATA wa_spfli TYPE TABLE OF spfli.

DATA: nodekey(200) VALUE 'NODE',
      nodetext(200) VALUE 'NODE',
      nodekeyold(200) VALUE 'NODE',
      getkey(200).

DATA menustr(10) VALUE ''.

CLASS lcl_application DEFINITION DEFERRED.

*----------------------------------------------------------------------*
*       CLASS LCL_APPLICATION DEFINITION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
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_node_context_menu_req
    FOR EVENT node_context_menu_request
    OF cl_gui_simple_tree
    IMPORTING node_key menu.

    METHODS:
          handle_node_context_menu_sel
            FOR EVENT node_context_menu_select
            OF cl_gui_simple_tree
            IMPORTING node_key fcode.
ENDCLASS.                    "LCL_APPLICATION DEFINITION

*----------------------------------------------------------------------*
*       CLASS LCL_APPLICATION IMPLEMENTATION
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
CLASS lcl_application IMPLEMENTATION.
  METHOD handle_node_double_click.
    nodekey = node_key.
    READ TABLE node_table WITH KEY node_key = node_key INTO node1.
    nodetext = node1-text.
  ENDMETHOD.                    "HANDLE_NODE_DOUBLE_CLICK

  METHOD handle_node_context_menu_req.
    CALL METHOD menu->add_function
      EXPORTING
        text  = '增加本级节点'
        fcode = 'CODE1'.

    CALL METHOD menu->add_function
      EXPORTING
        text  = '增加子节点'
        fcode = 'CODE2'.

    CALL METHOD menu->add_function
      EXPORTING
        text  = '修改当前节点'
        fcode = 'CODE3'.
    CALL METHOD menu->add_function
      EXPORTING
        text  = '删除当前节点'
        fcode = 'CODE4'.
  ENDMETHOD.                    "HANDLE_NODE_CONTEXT_MENU_REQ

  METHOD handle_node_context_menu_sel.
    DATA str1 TYPE tv_nodekey.
    CALL METHOD wa_tree->get_selected_node
      IMPORTING
        node_key = str1.
    IF sy-subrc = 0.
      menustr = fcode.
      nodekey = str1.
      nodekeyold = str1.

      READ TABLE node_table WITH KEY node_key = nodekey INTO node1.
      nodetext = node1-text.
      IF fcode = 'CODE4'.
        CALL METHOD wa_tree->delete_node
          EXPORTING
            node_key = node1-node_key.
        DELETE node_table WHERE node_key = nodekey.
      ENDIF.
    ENDIF.
  ENDMETHOD.                    "HANDLE_NODE_CONTEXT_MENU_SEL
ENDCLASS.                    "LCL_APPLICATION IMPLEMENTATION

DATA: g_application TYPE REF TO lcl_application.

START-OF-SELECTION.
  CALL SCREEN 100.

*----------------------------------------------------------------------*
*  MODULE STATUS_0100 OUTPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE status_0100 OUTPUT.
  IF wa_custom_container IS INITIAL.
    CREATE OBJECT g_application.
    PERFORM create_tree.
  ENDIF.
ENDMODULE.                    "STATUS_0100 OUTPUT

*----------------------------------------------------------------------*
*  MODULE USER_COMMAND_0100 INPUT
*----------------------------------------------------------------------*
*
*----------------------------------------------------------------------*
MODULE user_command_0100 INPUT.
  DATA str1 TYPE tv_nodekey.
  save_ok = ok_code.
  CLEAR ok_code.

  CASE save_ok.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
    WHEN 'GETKEY'.
      CALL METHOD wa_tree->get_selected_node
        IMPORTING
          node_key = str1.

      IF sy-subrc EQ 0.
        getkey = str1.
      ENDIF.

    WHEN 'UPDATE'.
      IF ( menustr = 'CODE1' ) OR ( menustr = 'CODE2').
        READ TABLE node_table
            WITH KEY node_key = nodekey INTO node1.
        IF sy-subrc EQ 0.
          MESSAGE e208(00) WITH '键值重复!'.
        ENDIF.
      ENDIF.

      CASE menustr.
        WHEN 'CODE1'.
          READ TABLE node_table WITH KEY node_key = nodekeyold INTO node2.

          CLEAR node1.
          node1-node_key = nodekey.
          node1-relatkey = node2-relatkey.
          node1-relatship = cl_gui_simple_tree=>relat_last_child.
          node1-hidden = ''.
          node1-disabled = ''.
          node1-isfolder = 'X'.
          node1-n_image = '@G3@'.
          node1-exp_image = '@G3@'.
          CLEAR node1-expander.
          node1-text = nodetext.
          APPEND node1 TO node_table.
          CLEAR anode_table.
          APPEND node1 TO anode_table.

          CALL METHOD wa_tree->add_nodes
            EXPORTING
              table_structure_name = 'MTREESNODE'
              node_table           = anode_table.
          IF sy-subrc <> 0.
          ENDIF.

        WHEN 'CODE2'.
          CLEAR node1.
          node1-node_key = nodekey.
          node1-relatkey = nodekeyold.
          node1-relatship = cl_gui_simple_tree=>relat_last_child.
          node1-hidden = ''.
          node1-disabled = ''.
          node1-isfolder = 'X'.
          node1-n_image = '@G3@'.
          node1-exp_image = '@G3@'.
          CLEAR node1-expander.
          node1-text = nodetext.
          APPEND node1 TO node_table.
          CLEAR anode_table.
          APPEND node1 TO anode_table.

          CALL METHOD wa_tree->add_nodes
            EXPORTING
              table_structure_name = 'MTREESNODE'
              node_table           = anode_table.
          IF sy-subrc <> 0.
          ENDIF.

        WHEN 'CODE3'.
          node1-node_key = nodekeyold.
          CALL METHOD wa_tree->node_set_text
            EXPORTING
              node_key = node1-node_key
              text     = nodetext.
          IF sy-subrc <> 0.
          ENDIF.

      ENDCASE.
  ENDCASE.
ENDMODULE.                    "USER_COMMAND_0100 INPUT

*&---------------------------------------------------------------------*
*&      Form  CREATE_TREE
*&---------------------------------------------------------------------*
*       text
*----------------------------------------------------------------------*
FORM create_tree.
*事件内表及单个事件对象.
  DATA: events TYPE cntl_simple_events,
        event1 TYPE cntl_simple_event.
*建立定制控制对象
  CREATE OBJECT wa_custom_container
    EXPORTING
      container_name = wa_container.
*建立树对象
  CREATE OBJECT wa_tree
    EXPORTING
      parent              = wa_custom_container
      node_selection_mode = cl_gui_simple_tree=>node_sel_mode_single.

  IF sy-subrc <> 0.
  ENDIF.
*开始建立以国家->城市->城区 三层的树
  CLEAR node1.
*节点关键字
  node1-node_key = 'CHINA'.
*第一层
  CLEAR node1-relatkey.
  CLEAR node1-relatship.
*是文件夹
  node1-hidden = ''.
  node1-disabled = ''.
  node1-isfolder = 'X'.
*不带ICON
  CLEAR node1-n_image.
  CLEAR node1-exp_image.
  CLEAR node1-expander.

  node1-text = '中国'.
  APPEND node1 TO node_table.


*二层节点
  CLEAR node1.
  node1-node_key = 'BJ'.
*上层关系
  node1-relatkey = 'CHINA'.
  node1-relatship = cl_gui_simple_tree=>relat_last_child.
  node1-hidden = ''.
  node1-disabled = ''.
  node1-isfolder = 'X'.
  CLEAR node1-n_image.
  CLEAR node1-exp_image.
  CLEAR node1-expander.
  node1-text = '北京'.
  APPEND node1 TO node_table.

  CLEAR node1.
  node1-node_key = 'SH'.
  node1-relatkey = 'CHINA'.
  node1-relatship = cl_gui_simple_tree=>relat_last_child.
  node1-hidden = ''.
  node1-disabled = ''.
  node1-isfolder = 'X'.
  CLEAR node1-n_image.
  CLEAR node1-exp_image.
  CLEAR node1-expander.
  node1-text = '上海'.
  APPEND node1 TO node_table.

*三层节点
  CLEAR node1.
  node1-node_key = 'CWQ'.
  node1-relatkey = 'BJ'.
  node1-relatship = cl_gui_simple_tree=>relat_last_child.
  node1-hidden = ''.
  node1-disabled = ''.
  node1-isfolder = ''.
*图标,可运行SHOWICON查阅
  node1-n_image = '@9Y@'.
  node1-exp_image = '@9Y@'.
  CLEAR node1-expander.
  node1-text = '崇文区'.
  APPEND node1 TO node_table.

  CLEAR node1.
  node1-node_key = 'XCQ'.
  node1-relatkey = 'BJ'.
  node1-relatship = cl_gui_simple_tree=>relat_last_child.
  node1-hidden = ''.
  node1-disabled = ''.
  node1-isfolder = ''.
  node1-n_image = '@DF@'.
  node1-exp_image = '@DF@'.
  CLEAR node1-expander.
  node1-text = '西城区'.
  APPEND node1 TO node_table.

  CLEAR node1.
  node1-node_key = 'MXQ'.
  node1-relatkey = 'SH'.
  node1-relatship = cl_gui_simple_tree=>relat_last_child.
  node1-hidden = ''.
  node1-disabled = ''.
  node1-isfolder = ''.
  node1-n_image = '@NL@'.
  node1-exp_image = '@NL@'.
  CLEAR node1-expander.
  node1-text = '闵行区'.
  APPEND node1 TO node_table.

*按照节点内容添加节点
  CALL METHOD wa_tree->add_nodes
    EXPORTING
      table_structure_name = 'MTREESNODE'
      node_table           = node_table.

  IF sy-subrc <> 0.
  ENDIF.

*定义双击事件
  event1-eventid = cl_gui_simple_tree=>eventid_node_double_click.
  event1-appl_event = 'X'.
  APPEND event1 TO events.
*添加事件内表
  CALL METHOD wa_tree->set_registered_events
    EXPORTING
      events = events.

  IF sy-subrc <> 0.
  ENDIF.

  CALL METHOD wa_tree->expand_node
    EXPORTING
      node_key            = 'CHINA'
      expand_subtree      = 'X'
    EXCEPTIONS
      failed              = 1
      illegal_level_count = 2
      cntl_system_error   = 3
      node_not_found      = 4
      cannot_expand_leaf  = 5.

  IF sy-subrc NE 0.
  ENDIF.


*定义双击事件
  event1-eventid = cl_gui_simple_tree=>eventid_node_double_click.
  event1-appl_event = 'X'.
  APPEND event1 TO events.

  event1-eventid = cl_gui_simple_tree=>eventid_node_context_menu_req.
  event1-appl_event = ''.
  APPEND event1 TO events.

  CALL METHOD wa_tree->set_ctx_menu_select_event_appl
    EXPORTING
      appl_event = 'X'.

*添加事件内表
  CALL METHOD wa_tree->set_registered_events
    EXPORTING
      events = events.


*将已定义的双击事件分配至树对象
  SET HANDLER g_application->handle_node_double_click FOR wa_tree.

  SET HANDLER g_application->handle_node_context_menu_req FOR wa_tree.

  SET HANDLER g_application->handle_node_context_menu_sel FOR wa_tree.

ENDFORM.                    "CREATE_TREE
 

 

4.Tree Control对象与ALV Grid对象关联

REPORT YHELLOA.
DATA: OK_CODE TYPE SY-UCOMM,
      SAVE_OK TYPE SY-UCOMM.

DATA: WA_CONTAINER TYPE SCRFNAME VALUE 'TREE',
      WA_CONTAINERALV TYPE SCRFNAME VALUE 'ALV',
      WA_CUSTOM_CONTAINER TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
      WA_CUSTOM_CONTAINERALV TYPE REF TO CL_GUI_CUSTOM_CONTAINER,
      WA_TREE TYPE REF TO CL_GUI_SIMPLE_TREE,
      WA_ALV TYPE REF TO CL_GUI_ALV_GRID.

DATA: NODE_TABLE LIKE TABLE OF MTREESNODE,
      NODE1 TYPE MTREESNODE.

DATA WA_SPFLI TYPE TABLE OF SPFLI WITH HEADER LINE.
DATA WA_SFLIGHT TYPE TABLE OF SFLIGHT.

DATA: NODEKEY(200) VALUE 'NODE',
      NODETEXT(200) VALUE 'NODE'.

CLASS LCL_APPLICATION DEFINITION DEFERRED.
DATA EVENT_RECEIVER TYPE REF TO LCL_APPLICATION.

CLASS LCL_APPLICATION DEFINITION.
  PUBLIC SECTION.

  METHODS HANDLE_NODE_DOUBLE_CLICK
      FOR EVENT NODE_DOUBLE_CLICK
      OF CL_GUI_SIMPLE_TREE
      IMPORTING NODE_KEY.
ENDCLASS.

CLASS LCL_APPLICATION IMPLEMENTATION.
  METHOD HANDLE_NODE_DOUBLE_CLICK.
    NODEKEY = NODE_KEY.
    READ TABLE NODE_TABLE WITH KEY NODE_KEY = NODE_KEY INTO NODE1.
    NODETEXT = NODE1-TEXT.

    CLEAR WA_SFLIGHT.
    SELECT * INTO TABLE WA_SFLIGHT FROM SFLIGHT
      WHERE CARRID = NODE1-NODE_KEY+2(2)
        AND CONNID = NODE1-NODE_KEY+4(4).

    CALL METHOD WA_ALV->SET_TABLE_FOR_FIRST_DISPLAY
      EXPORTING
        I_STRUCTURE_NAME = 'SFLIGHT'
      CHANGING
        IT_OUTTAB = WA_SFLIGHT.
   ENDMETHOD.
ENDCLASS.

DATA G_APPLICATION TYPE REF TO LCL_APPLICATION.

START-OF-SELECTION.
  SELECT * INTO TABLE WA_SPFLI FROM SPFLI
    ORDER BY COUNTRYFR CARRID ASCENDING.

  CREATE OBJECT G_APPLICATION.
  SET SCREEN 100.

MODULE STATUS_0100 OUTPUT.
  IF WA_CUSTOM_CONTAINER IS INITIAL.
    PERFORM CREATE_TREE.
  ENDIF.
ENDMODULE.

MODULE USER_COMMAND_0100 INPUT.
  SAVE_OK = OK_CODE.
  CLEAR OK_CODE.
  CASE SAVE_OK.
    WHEN 'EXIT'.
      LEAVE PROGRAM.
  ENDCASE.
ENDMODULE.

FORM CREATE_TREE.
  DATA: EVENTS TYPE CNTL_SIMPLE_EVENTS,
        EVENT1 TYPE CNTL_SIMPLE_EVENT.

*建立定制控制对象
  CREATE OBJECT WA_CUSTOM_CONTAINER
  EXPORTING
    CONTAINER_NAME = WA_CONTAINER.

*创建ALV对象
  CREATE OBJECT WA_CUSTOM_CONTAINERALV
  EXPORTING
    CONTAINER_NAME = WA_CONTAINERALV.

  CREATE OBJECT WA_ALV
  EXPORTING
    I_PARENT = WA_CUSTOM_CONTAINERALV.

*建立树对象
  CREATE OBJECT WA_TREE
  EXPORTING
    PARENT = WA_CUSTOM_CONTAINER
    NODE_SELECTION_MODE = CL_GUI_SIMPLE_TREE=>NODE_SEL_MODE_SINGLE.

  IF SY-SUBRC <> 0.
  ENDIF.

  DATA: COUNTRYFR LIKE SPFLI-COUNTRYFR,
        CARRID LIKE SPFLI-CARRID.

  DATA:STR1(255).

  LOOP AT WA_SPFLI.
    IF COUNTRYFR NE WA_SPFLI-COUNTRYFR.
      CLEAR NODE1.
      NODE1-NODE_KEY = WA_SPFLI-COUNTRYFR.
*第一层
      CLEAR NODE1-RELATKEY.
      CLEAR NODE1-RELATSHIP.
*是文件夹
      NODE1-HIDDEN = ''.
      NODE1-DISABLED = ''.
      NODE1-ISFOLDER = 'X'.
*不带ICON
      CLEAR NODE1-N_IMAGE.
      CLEAR NODE1-EXP_IMAGE.
      CLEAR NODE1-EXPANDER.

      NODE1-TEXT = WA_SPFLI-COUNTRYFR.
      APPEND NODE1 TO NODE_TABLE.
    ENDIF.

    IF ( COUNTRYFR NE WA_SPFLI-COUNTRYFR ) OR ( CARRID <> WA_SPFLI-CARRID ).
      CLEAR NODE1.
      CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID INTO NODE1-NODE_KEY.
*上层关系
      NODE1-RELATKEY = WA_SPFLI-COUNTRYFR.
      NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
      NODE1-HIDDEN = ''.
      NODE1-DISABLED = ''.
      NODE1-ISFOLDER = 'X'.
      CLEAR NODE1-N_IMAGE.
      CLEAR NODE1-EXP_IMAGE.
      CLEAR NODE1-EXPANDER.
*节点显示CARRID
      NODE1-TEXT = WA_SPFLI-CARRID.
      APPEND NODE1 TO NODE_TABLE.
    ENDIF.

    COUNTRYFR = WA_SPFLI-COUNTRYFR.
    CARRID = WA_SPFLI-CARRID.
    CLEAR NODE1.
    CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID
    WA_SPFLI-CONNID INTO NODE1-NODE_KEY.

    CONCATENATE WA_SPFLI-COUNTRYFR WA_SPFLI-CARRID INTO STR1.
    NODE1-RELATKEY = STR1.
    NODE1-RELATSHIP = CL_GUI_SIMPLE_TREE=>RELAT_LAST_CHILD.
    NODE1-HIDDEN = ''.
    NODE1-DISABLED = ''.
    NODE1-ISFOLDER = 'X'.
    NODE1-N_IMAGE = '@5B@'.
    NODE1-EXP_IMAGE = '@5B@'.
    CLEAR NODE1-EXPANDER.
    CONCATENATE WA_SPFLI-CARRID ':' WA_SPFLI-CITYFROM INTO STR1.
    NODE1-TEXT = STR1.
    APPEND NODE1 TO NODE_TABLE.
  ENDLOOP.

*按照节点内容添加节点
  CALL METHOD WA_TREE->ADD_NODES
  EXPORTING
    TABLE_STRUCTURE_NAME = 'MTREESNODE'
    NODE_TABLE = NODE_TABLE.
  IF SY-SUBRC <> 0.
  ENDIF.

*定义双击事件
  EVENT1-EVENTID = CL_GUI_SIMPLE_TREE=>EVENTID_NODE_DOUBLE_CLICK.
  EVENT1-APPL_EVENT = 'X'.
  APPEND EVENT1 TO EVENTS.

  CALL METHOD WA_TREE->SET_REGISTERED_EVENTS
    EXPORTING
      EVENTS = EVENTS.

  IF SY-SUBRC <> 0.
  ENDIF.

*将已定义的双击事件分配至树对象
  SET HANDLER G_APPLICATION->HANDLE_NODE_DOUBLE_CLICK FOR WA_TREE.
ENDFORM.

 

 

 

 

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值