使ALV控件中的內容可編輯
這應該是一個非常有用的功能,這樣我們便可以用它來代替table control來編出一些有這現成功能的界面來。實際上,讓alv中的內容可以被編輯與alv的事件無關。但是經常需要驗證輸入的數據,所以還是需要從事件開始談起。
想使一列可以被編輯只需在field catalog中把edit字段設為’X’即可。如果設置了可編輯的字段那么alv便會添加相應的編輯按鈕。如果不需要這些按鈕那么可以按上面說過的方法排除他們。
如果想使某個單元格可編輯,那么就要用到上面所提到的把某個單元格作為按鈕的那個內表。它的類型是LVC_T_STYL。向這個內表中添加記錄,把需要字段名傳給FIELDNAME,把cl_gui_alv_grid=>mc_style_enabled傳給style以使這個字段可以被編輯,或者把cl_gui_alv_grid=>mc_style_disabled傳給style以使這個字段不能被編輯。如果已經把整列設為可編輯,而只想讓這個列中的某些單元格不可編輯,可以使用這種方法。正如前面所述,需要告訴layout那個字段是style字段。
Gs_layout-stylefname = ‘CELLSTYLES’.
下面是關於這些功能的一段代碼:我們已經把’SEATSMAX’整列設為可編輯狀態,但當CARRID為’xy’時除外。如果connid是’02’時我們就使‘PLANETYPE’可編輯。
我們把style table添加到了我們的顯示表中,並在layout structure中說明style field。我們在field catalog中把相應的EDIT設為‘X’。
1 FORM adjust_edittables USING pt_list LIKE gt_list[]. 2 3 DATA ls_listrow LIKE LINE OF pt_list. 4 5 DATA ls_stylerow TYPE lvc_s_styl. 6 7 DATA lt_styletab TYPE lvc_t_styl. 8 9 10 11 LOOP AT pt_list INTO ls_listrow. 12 13 IF ls_listrow-carrid = ‘XY’. 14 15 Ls_stylerow-fieldname = ‘SEATSMAX’. 16 17 Ls_stylerow-style = cl_alv_grid=>mc_style_disabled. 18 19 APPEND ls_stylerow TO lt_styletab. 20 21 ENDIF. 22 23 IF ls_listrow-connid = ‘02’. 24 25 Ls_stylerow-fieldname = ‘PLANETYPE’ 26 27 Ls_stylerow-.style = cl_alv_grid=>mc_style_enabled. 28 29 APPEND ls_Pstylerow TO lt_styletab. 30 31 ENDIF. 32 33 INSERT LINES OF lt_styletab INTO ls_listrow-cellstyles. 34 35 MODIFY pt_list FROM ls_listrow. 36 37 ENDLOOP. 38 39 ENDFORM.
通常情況下,單元格的設置會覆蓋整列的設置。可以在程序里動態切換各種模式。只需要在內表中插入想要的設置並刷新顯示即可。對於整列來說可以設置field catalog的EDIT屬性,然后通過方法set_frontent_fieldcatalog來重新設置field catalog。
最后,需要使用方法set_ready_for_input傳入參數i_ready_for_input = 1即可。
用這個方法可以在編輯和不可編輯模式之間切換。顯然如果把參數i_ready_for_input=0即進入不可編輯狀態。
控制數據的變化
我們可以使alv處於可編輯狀態,我們還需要控制數據的輸入。Alv grid有連個事件,即data_changed和data_changed_finished。第一個事件在可編輯字段的數值發生變化時觸發,可以用來檢查數據的輸入,第二個事件是當修改已經完成后觸發。
可以通過方法register_edit_event來設置alv如何察覺數據的改變。有兩個選項
I 按回車鍵之后:i_event_id = cl_gui_alv_grid=>mc_event_enter
II 當鼠標有當前編輯的字段移到另一個字段:i_event_id = cl_gui_alv_grid=>mc_event_modifies
要想控制數據的輸入,必須通過這個方法設置一種方式,否則事件就不會被觸發。
為了控制字段的修改通過事件data_changed把類CL_ALV_CHANGED_DATA_PROTOCOL的實例傳給alv grid。通過這個類的方法,就可以得到單元格的值並修改它或者產生錯誤信息。
下面是這個類的一些方法:
Get_cell_value
|
Gets the cell value.You pass the interface the position of the cell
|
Modify_cell
|
Modifies the cell value addressed via parameters
|
Add_protocol_entry
|
Add a log entry. You make use of standard message interface with message type, message id etc.
|
Protocol_is_visible
|
Make the error table visible or not
|
Refresh_protocol
|
Refreshing log entries
|
通過這個事列的指針變量,可以得到一些修改的信息。下表是對這些信息的一些列舉:
MT_MOD_CELLS
|
Contains address of modified cells with rowed and field name
|
MT_MOD_ROWS
|
Contain modified rows Its type is genric
|
MT_GOOD_CELLS
|
Contain cells have proper values
|
MT_DELETED_ROWS
|
Contain rows deleted from the list
|
MT_INSERTED_ROWS
|
Contain rows deleted from the list
|
通過上面的方法和屬性就可以檢查數據的輸入給出正確的消息或修改它們的值。