首先定義概念:文中的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.