首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件CONTEXT_MENU_SELECT of CL_SIMPLE_TREE_MODEL -不能触发它

事件CONTEXT_MENU_SELECT of CL_SIMPLE_TREE_MODEL -不能触发它
EN

Stack Overflow用户
提问于 2012-11-06 15:57:20
回答 1查看 2K关注 0票数 3

我有一个CL_SIMPLE_TREE_MODEL实例,我成功地触发和处理了CONTEXT_MENU_REQUEST事件,并构建了上下文菜单。

我以我想要的方式增加了我的功能。

问题是,当我从上下文菜单中选择一个选项时,什么都不会发生。换句话说,程序流不进入CONTEXT_MENU_SELECT的处理程序中。

当然,当我单击上下文菜单中的函数时,我假设会触发此事件。

我找到了正式的文档,但只针对您使用Shift+F10访问的“默认上下文菜单”,它需要程序中的某些子程序才能启动。

我所做的:

  1. 我确实定义并实现了一个作为该事件的处理程序的方法。
  2. 我确实在设置CONTEXT_MENU_REQUEST事件的处理程序的位置设置了事件的处理程序。
  3. 我没有向SET_REGISTERED_EVENTS注册事件,因为该事件的类属性中没有定义ID --比如CONTEXT_MENU_REQUEST事件。

守则:

代码语言:javascript
复制
REPORT.

CLASS lcl_tree_handler DEFINITION.

  PUBLIC SECTION.
    METHODS:
      pbo,
      on_ctx_menu_request FOR EVENT node_context_menu_request OF cl_simple_tree_model
        IMPORTING node_key menu sender, "TYPE TM_NODEKEY CL_CTMENU
      on_ctx_menu_select FOR EVENT node_context_menu_select OF cl_simple_tree_model
        IMPORTING node_key fcode. "TYPE TM_NODEKEY SY-UCOMM
    DATA:
      po_tree_model TYPE REF TO cl_simple_tree_model,
      gt_tree       TYPE TABLE OF treemsnodt,
      control       TYPE REF TO cl_gui_control.
ENDCLASS.

CLASS lcl_tree_handler IMPLEMENTATION.

  METHOD pbo.
    DATA: lt_events TYPE cntl_simple_events,
          ls_event  TYPE cntl_simple_event.
    FIELD-SYMBOLS <gs_tree> TYPE treemsnodt.

    CHECK po_tree_model IS NOT BOUND.

    CREATE OBJECT po_tree_model
      EXPORTING
        node_selection_mode = po_tree_model->node_sel_mode_single.

    APPEND INITIAL LINE TO gt_tree ASSIGNING <gs_tree>.
    <gs_tree>-node_key = 'Node key 1'.
    <gs_tree>-text = 'First node'.
    <gs_tree>-isfolder = 'X'.
    APPEND INITIAL LINE TO gt_tree ASSIGNING <gs_tree>.
    <gs_tree>-node_key = 'Node key 2'.
    <gs_tree>-relatkey = 'Node key 1'.
    <gs_tree>-relatship = cl_tree_model=>relat_last_child.
    <gs_tree>-text = 'First child'.
    po_tree_model->add_nodes(
          node_table = gt_tree ).

    ls_event-eventid = cl_simple_tree_model=>eventid_node_context_menu_req.
    ls_event-appl_event = 'X'.              "tried with space too
    APPEND ls_event TO lt_events.

    CALL METHOD po_tree_model->set_registered_events
      EXPORTING
        events = lt_events.

    SET HANDLER on_ctx_menu_request FOR po_tree_model.
    SET HANDLER on_ctx_menu_select FOR po_tree_model.

    po_tree_model->create_tree_control(
      EXPORTING
        parent = cl_gui_container=>screen0
      IMPORTING
        control = control ).

  ENDMETHOD.

  METHOD on_ctx_menu_request.                 "I initialize the context menu object here.
    DATA: lt_chidren_keys TYPE treemnotab,
          ls_child_key    TYPE tm_nodekey,
          lv_text         TYPE gui_text.

    CALL METHOD sender->node_get_children
      EXPORTING
        node_key       = node_key
      IMPORTING
        node_key_table = lt_chidren_keys
      EXCEPTIONS
        OTHERS         = 2.

    LOOP AT lt_chidren_keys INTO ls_child_key.
      lv_text = ls_child_key.
      CALL METHOD menu->add_function
        EXPORTING
          fcode = 'ONE'
          text  = lv_text
          ftype = 'B'.
    ENDLOOP.

    menu->add_separator( ).
    CALL METHOD menu->add_function
      EXPORTING
        fcode = 'ALL'
        text  = 'All the work groups'
        ftype = 'W'.

  ENDMETHOD.

  METHOD on_ctx_menu_select.
    BREAK-POINT.                 "tried actual code here too.
  ENDMETHOD.

ENDCLASS.


DATA: go_tree_handler TYPE REF TO lcl_tree_handler.

PARAMETERS dummy.

INITIALIZATION.
  CREATE OBJECT go_tree_handler.

AT SELECTION-SCREEN OUTPUT.
  go_tree_handler->pbo( ).

AT SELECTION-SCREEN ON EXIT-COMMAND.
  go_tree_handler->control->free( ).

显示树,右键单击“上下文”菜单。

但是当我选择一个菜单项时,没有任何东西会触发。我漏掉了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-07 10:51:44

不支持您指定的函数类型(ftype = 'W''B') (请检查基础域CUA_FUNTYP的固定值)。那样的话,什么都不会发生。

经典的解决方案是使用ftype = ' ' (正常函数):

代码语言:javascript
复制
    LOOP AT lt_chidren_keys INTO ls_child_key.
      lv_text = ls_child_key.
      CALL METHOD menu->add_function
        EXPORTING
          fcode = 'ONE'
          text  = lv_text
          ftype = ' '.
    ENDLOOP.

    menu->add_separator( ).
    CALL METHOD menu->add_function
      EXPORTING
        fcode = 'ALL'
        text  = 'All the work groups'
        ftype = ' '.

可能的ftype值是(来源:域CUA_FUNTYP):

  • “”:正常函数
  • 'H‘:帮助功能(根据帮助请求处理)
  • 系统功能(直接由DYNP处理)
  • T‘:事务调用(留给事务处理)
  • 'E‘:作为前缀的“AT退出命令”-> /E的访问模块
  • “i”:包含菜单(在运行时替换-不支持)
  • 'N‘:'AT EXIT命令’函数,> DYNP > /N作为前缀

备注:问题的第一个版本中的代码丢失了第二个事件处理程序SET HANDLER go_tree_handler->on_ctx_menu_select FOR po_tree_model.的注册(现在可以了)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13254719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档