abap oo alv
OO ALV
1.相關類
CL_GUI_ALV_GRID
CL_GUI_CUSTOM_CONTAINER
CL_GUI_DOCKING_CONTAINER
CL_GUI_SPLITTER_CONTAINER
2.控制區域、容器、Grid關係
先在螢幕上繪製一個使用者自定義控制元件區域,然後該使用者以自定義控制元件區域為基礎來建立CL_GUI_CUSTOM_CONTAINER容器例項,最後以此容器例項來建立CL_GUI_ALV_GRID例項
3. CL_GUI_ALV_GRID重要方法
set_table_for_first_dispaly
REFRESH_TABLE_DISPLAY
IS_STABLE
I_SOFT_REFRESH:軟重新整理,如果設定了這個引數,臨時給ALV建立的合計、排序、資料過濾都將保持不變。這個是非常有意義的,例如:當你沒有修改資料內表裡的資料,但因佈局修改了想重新整理ALV時可使用
4.set_table_for_first_dispaly()方法重要引數
IS_VARIANT I_SAVE I_DEFAULT |
IS_LAYOUT IT_OUTTAB IT_FIELDCATALOG |
IT_SORT |
5. 事件繫結、觸發、回撥處理
CLASS cl_event_handle DEFINITION. "定義事件處理類
PUBLIC SECTION.
"ALV工具欄初始化事件,如增加按鈕並設定屬性
METHODS handle_toolbar FOR EVENT toolbar OF cl_gui_alv_grid
IMPORTING e_object e_interactive.
"ALV工具欄按鈕點選事件
METHODS handle_user_command FOR EVENT user_command OF cl_gui_alv_grid
IMPORTING e_ucomm.
"ALV表格雙擊事件
METHODS handle_double_click FOR EVENT double_click OF cl_gui_alv_grid
IMPORTING
ENDCLASS.
CLASS cl_event_handle IMPLEMENTATION."事件處理類實現部分
METHOD handle_toolbar.
gs_toolbar-function = 'B_SUM'."按鈕的FunctionCode
gs_toolbar-icon = icon_display."按鈕圖示
gs_toolbar-text = '總行數'."按鈕標籤
gs_toolbar-butn_type = '0'."定義按鈕型別,0為標準按鈕
APPEND gs_toolbar TO e_object->mt_toolbar."新增按鈕到工具欄中
ENDMETHOD.
METHOD handle_user_command.
DATA: sum TYPE i .
IF e_ucomm = 'B_SUM'.
...
ENDIF.
ENDMETHOD.
METHOD handle_double_click.
....
ENDMETHOD.
ENDCLASS.
CREATE OBJECT container_r EXPORTING container_name = 'CONTAINER_1'."建立ALV容器物件
CREATE OBJECT grid_r EXPORTING i_parent = container_r. "建立ALV控制元件
CALL METHOD grid_r->set_table_for_first_displayCHANGING it_outtab = gt_sflight[].
SET HANDLER:event_handle->handle_toolbar FOR grid_r, "註冊處理器
event_handle->handle_user_command FOR grid_r,
event_handle->handle_double_click FOR grid_r.
CALL METHOD grid_r->set_toolbar_interactive. "呼叫此方法才能啟用工具欄上增加的自定義按鈕
6. CL_GUI_DOCKING_CONTAINER容器
Docking容器最大特點是在程式碼中可以動態建立容器,不需要像建立自定義容器CL_GUI_CUSTOM_CONTAINER那樣,在建立時需要將其繫結到一個預先繪製好的使用者自定義控制元件區域中
7.覆蓋(攔截)預設按鈕的功能FunCode:BEFORE_USER_COMMAND
在before_user_command事件中擷取標準的功能,完成其他功能,然後使用方法set_user_command將功能程式碼修改為空(如何攔截事件,則參考事件繫結、觸發、回撥處理章節)
FORM handle_before_user_command USING i_ucomm TYPE syucomm .
CASE e_ucomm .
WHEN '&INFO' .
CALL FUNCTION 'ZSFLIGHT_PROG_INFO'.
CALL METHOD gr_alvgrid->set_user_commandEXPORTING i_ucomm = space.
ENDCASE .
ENDFORM .
8. 資料改變事件data_changed、data_changed_finished
Alv grid有兩個事件:data_changed和ata_changed_finished.第一個事件在可編輯欄位的資料發生變化時觸發,可用來檢查資料的輸入正確性,第二個事件是當資料修改完成後觸發
如果資料沒有被修改,當失去焦點或回車時,那麼它不會走data change,而是直接觸發data change finish事件
可以通過CL_GUI_ALV_GRID類的REGISTER_EDIT_EVENT方法來設定在失去焦點或回車時,觸發資料改變事件:
²按回車觸發: i_event_id = cl_gui_alv_grid=>mc_event_enter
²單元格失去焦點: i_event_id = cl_gui_alv_grid=>mc_event_modifies
必須設定一種方式,要不然資料變化事件不會被觸發事件
然後註冊CL_GUI_ALV_GRID的data_changed、data_changed_finished事件,實現事件處理器方法,在資料發生改變時就會觸發這兩上事件