实例:关于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。
最后,需要使用方法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
|
通过上面的方法和属性就可以检查数据的输入给出正确的消息或修改它们的值。