OO方式下,ALV TREE和ALV GRID的不同之處


作為大部分報表程序的基礎,ALV GRID差不多是每個ABAP開發者必須了解和掌握的內容,因此網上也不乏相關資料,而ALV TREE的應用相對較少,中文資料也就比較少見了。實際上,ALV TREE和ALV GRID的實現整體上是相似的,因此對於使用過ALV GRID的開發者來說,掌握ALV TREE會比較容易。但二者也有一些不同之處,可能會在開發過程中引起人們的困惑,現總結如下

首先定義概念:文中的ALV GRID指的是由OO方式建立的、由類cl_gui_alv_grid實例化后產生的ALV GRID,而ALV TREE指的是由類cl_gui_alv_tree實例化后產生的ALV TREE

 

1,輸出內容的構建方式

      ALV GRID的輸出數據是通過直接將查詢結果內表作為參數傳遞到ALV GRID對象的 set_table_for_first_display方法而顯示的。

    在ALV TREE中,傳入set_table_for_first_display方法的內表需要為空,顯示的數據則由 add_node方法傳入。

(如果是cl_gui_alv_tree_simple,則可通過與ALV GRID相同的方法,在set_table_for_first_display方法傳入查詢結果內表)

2,自定義按鈕的添加

       在ALV GRID中,如要建立工具欄自定義按鈕,可以在ALV GRID的toolbar事件觸發時使用 cl_alv_event_toolbar_set方法添加自定義按鈕。自定義按鈕觸發的功能碼由ALV GRID的usercommand事件接收並處理。

     而ALV TREE中是不存在toolbar事件的,因此,在ALV TREE中創建工具欄自定義按鈕,需要使用類cl_gui_toolbar的對象,調用其add_button方法。同樣的,自定義按鈕觸發的功能碼也不是由ALV TREE的事件接收,而是由cl_gui_toolbar的on_function_selected事件接收和處理。

3,刷新顯示

      對ALV GRID來說,如果修改了表格中的內容,需要刷新后方可顯示。 ALV GRID的刷新使用cl_gui_grid的refresh_table_display方法實現。

      對ALV TREE而言,因為最初使用set_table_for_first_display的時候內表是空的(參考上文第一條),必須使用add_node增加節點,之后TREE當中才會有實際內容。因此,它的刷新是必須的,而不是像ALV GRID一樣,如果沒有變化,在初始化顯示之后可以不刷新。ALV TREE中方法refresh_table_display是私有方法,無法直接調用,應通過cl_gui_alv_tree的update_calculations方法和frontend_update方法實現更新。代碼片段如下:

 CREATE OBJECT g_tree
    EXPORTING
      ……
    EXCEPTIONS
      ……
  PERFORM build_fieldcatalog.
*拖拽對象
  PERFORM define_dnd_behaviour.
*添加節點
  PERFORM add_nodes USING hierarchy_header.
*添加工具欄按鈕
  PERFORM change_toolbar.
*注冊事件
  PERFORM register_events.
*更新顯示
  CALL METHOD g_tree->update_calculations.
  CALL METHOD g_tree->frontend_update.

4,事件注冊方式

  ALV GRID中,注冊事件使用set handle語句即可。

  ALV TREE中,事件的注冊同樣使用set handle,但某些事件稍微麻煩一點

  需要使用到get/set_registered_events方法,方才有效:

  CALL METHOD g_tree->get_registered_events
    IMPORTING
      events = lt_events.

  l_event-eventid = cl_gui_column_tree=>eventid_node_double_click.
  APPEND l_event TO lt_events.
  l_event-eventid = cl_gui_column_tree=>eventid_node_context_menu_req.
  APPEND l_event TO lt_events.

  CALL METHOD g_tree->set_registered_events
    EXPORTING
      events                    = lt_events
    EXCEPTIONS
      cntl_error                = 1
      cntl_system_error         = 2
      illegal_event_combination = 3.
  IF sy-subrc <> 0.
    MESSAGE x208(00) WITH 'ERROR'.                          "#EC NOTEXT
  ENDIF.

  CREATE OBJECT l_event_receiver.
  SET HANDLER l_event_receiver->handle_node_double_click FOR g_tree.
  SET HANDLER l_event_receiver->handle_node_cm_req FOR g_tree.
  SET HANDLER l_event_receiver->handle_node_cm_sel FOR g_tree.

 

本文鏈接:http://www.cnblogs.com/hhelibeb/p/5748296.html

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM