您的位置:首页 > 其它

ALV GRID 参考文档 ( 15 ) - 单元输入事件

2008-05-27 16:10 295 查看
ALV单元格设置为可输入后,通常我们需要对单元格输入的值做一个检查,
一般来说用循环内表的方法可以实现上述操作,不过如果ALV中有大量数据,
而我们只更新了少量的单元格数据,这样检查显得非常的麻烦,而且效率低下
在ALV OO中我们可以通过DATA_CHANGE事件得到被修改的单元格的信息,
利用这些信息我们可以很方便的对所填数据做检查,别且可以给用户相应的错误提示,
以及自动修改单元格数据
1. 我们需要在处理事件的类中添加一个处理DATA_CHANGE事件的方法
Eg:
CLASS lcl_alv_receiver DEFINITION DEFERRED.
CLASS lcl_alv_receiver DEFINITION.
PUBLIC SECTION.
……..
METHODS:
handle_data_changed
FOR EVENT data_changed OF cl_gui_alv_grid
IMPORTING er_data_changed e_onf4 e_onf4_before e_onf4_after e_ucomm.
ENDCLASS. "lcl_event_receiver DEFINITION
2. 初始化ALV后为lcl_alv_receiver类注册一个DATA_CHANGED事件 Eg:
CALL METHOD g_grid->set_table_for_first_display
EXPORTING
i_save = x_save
is_variant = ls_layout
is_layout = is_layout
CHANGING
it_fieldcatalog = it_fieldcat
it_outtab = lt_zqsdmx[].
SET HANDLER g_alv_application->handle_data_changed FOR g_grid.
CALL METHOD g_grid->register_edit_event “注册更新事件
EXPORTING
i_event_id = cl_gui_alv_grid=>mc_evt_enter .
其中i_event_id = cl_gui_alv_grid=>mc_evt_enter 表示在单元格修改后回车或者执行其他操作时触发事件,
此类型可用于多个单元格修改后一起检查修改的值
i_event_id = cl_gui_alv_grid=>mc_evt_modified 表示单光标焦点移开被修改单元格后既触发事件,
此类型可用于每个每个单元个的实时更新检查

3.实现lcl_alv_receiver类的handle_data_changed方法,其中一些常用的一些属性方法我会在后附表列出
Eg:
CLASS lcl_alv_receiver IMPLEMENTATION.
METHOD handle_toolbar.
METHOD handle_data_changed.
PERFORM. handle_data_changed USING er_data_changed.
ENDMETHOD. "handle_data_changed
ENDCLASS. "lcl_ALV_event_receiver

*&---------------------------------------------------------------------*
*& Form handle_data_changed
*&---------------------------------------------------------------------*
* text
*----------------------------------------------------------------------*
* -->P_ER_DATA_CHANGED text
*----------------------------------------------------------------------*
FORM. handle_data_changed USING p_er_data_changed TYPE REF TO cl_alv_changed_data_protocol.
*如果更新的reason字段长度小于10为则提示用户填入字符数不能低于10
DATA:mod_data TYPE lvc_t_modi,
wa_mod_data TYPE lvc_s_modi.
mod_data = p_er_data_changed->mt_mod_cells.
LOOP AT mod_data INTO wa_mod_data Where fieldname = 'ZRESON'.
IF STRLEN( wa_mod_data-value ) < 10.
CALL METHOD p_er_data_changed->add_protocol_entry
EXPORTING
i_msgid = '00'
i_msgty = 'E'
i_msgno = '001'
i_msgv1 = '长度必须大于10 '
i_fieldname = wa_mod_data-fieldname.
*如果长度小于10,则将字段内容更新为长都无法确定
CALL METHOD p_er_data_changed->modify_cell
EXPORTING
i_row_id = wa_mod_data-row_id
i_fieldname = wa_mod_data-fieldname.
ENDIF.
ENDLOOP.
EBNDFORM.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: