- OOALV在单元格编辑时数据发生了改变同步到程序的内表。
- 主要依赖于cl_gui_alv_grid内置事件 data_changed实现
- 类的定义和实现
CLASS cl_event DEFINITION. PUBLIC SECTION. METHODS handle_data_changed FOR EVENT data_changed OF cl_gui_alv_grid IMPORTING er_data_changed. ENDCLASS. CLASS cl_event IMPLEMENTATION. METHOD handle_data_changed. "er_data_changed->mt_mod_cells这是在ALV做了数据修改的时给方法生成的传入参数内表 "<ft_alv>是调用方法时的展示OOALV的内表 "注意:er_data_changed->mt_mod_cells这个内表的结构和被调用的<ft_alv>内表不同 "所以要把做了修改的数据 er_data_changed->mt_mod_cells 补充到 被调用的程序内表<ft_alv> LOOP AT er_data_changed->mt_mod_cells INTO DATA(ls_cell). "1.读到修改的行 READ TABLE <ft_alv> ASSIGNING FIELD-SYMBOL(<fs_data05>) INDEX ls_cell-row_id. IF sy-subrc = 0 . "2.根据字段修改对应的值 CASE ls_cell-fieldname. WHEN 'SEL'. ASSIGN COMPONENT 'SEL' OF STRUCTURE <fs_data05> TO <fs_field>. IF sy-subrc = 0. <fs_field> = ls_cell-value. ENDIF. WHEN 'MENGE'. ASSIGN COMPONENT 'ZMENGE' OF STRUCTURE <fs_data05> TO <fs_field>. IF sy-subrc = 0. <fs_field> = ls_cell-value. ENDIF. ENDCASE. ENDIF. ENDLOOP. "当OOALV被调用的内表发生了变化,但是OOALV没发生变化,要么需要被再次调用才能展示 "所以用到OOALV刷新的方式,内表变化了,OOLAV也变化 "注意上面的OOALV没发生变化的意思是: "1.<ft_alv>的数据虽然在上面的操作中已经发生改变,但是<ft_alv>是在被OOALV实例对象方法调用之 "后才发的改变的,所以OOALV实例对象的属性还是基于<ft_alv>未发生数据改变的状态 "2.虽然OOALV做编辑操作时,OOALV界面的值确实发生了改变,但是这是假的视觉效果 "本质还是和1.的解释相同,例如,就像某些网页注册信息、修改信息,刷新网页加载最新的数据 DATA: ls_stable TYPE lvc_s_stbl. "刷新稳定性 ls_stable-row = ‘1’. ls_stable-col = ‘1’. CALL METHOD go_alv->refresh_table_display EXPORTING is_stable = lv_stable. ENDMETHOD. ENDCLASS.
- 通过事件处理类的实例对象给OOALVDUI的实例对象设置注册事件
CREATE OBJECT go_con EXPORTING container_name = 'CONTORL'. CREATE OBJECT go_alv EXPORTING I_parent = go_con. DATA(lo_event) = NEW cl_event( ). SET HANDLER lo_event->handle_data_changed FOR go_alv. ** 将焦点设置到ALV上 CALL METHOD cl_gui_control=>set_focus EXPORTING control = go_alv. ** data_changed事件触发时点 CALL METHOD go_alv->register_edit_event EXPORTING ** i_event_id = cl_gui_alv_grid=>mc_evt_enter "回车时触发 i_event_id = cl_gui_alv_grid=>mc_evt_modified "单元格修改时触发 EXCEPTIONS error = 1 OTHERS = 2.