實例:關於ALV控件可編輯的整理

使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。ui

最後,須要使用方法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
 
 
 
 
 
 
 
 
 
經過上面的方法和屬性就能夠檢查數據的輸入給出正確的消息或修改它們的值。
相關文章
相關標籤/搜索