DATA_CHANGED_FINISHED 中使用刷新方法REFRESH_TABLE_DISPLAY 会导致sort 出现强制弹出选择字段的窗口的异常情况.
CLASS LCL_EVENTS DEFINITION.
METHODS DATA_CHANGED_FINISHED
FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
IMPORTING E_MODIFIED
ET_GOOD_CELLS
SENDER.
METHODS HANDLE_DATA_CHANGED
FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED.
PRIVATE SECTION.
DATA G_REFRESH TYPE C.
ENDCLASS.
" 类实现
CLASS LCL_APPLICATION IMPLEMENTATION.
METHOD DATA_CHANGED_FINISHED.
PERFORM DATA_CHANGED_FINISHED USING E_MODIFIED ET_GOOD_CELLS SENDER G_REFRESH.
ENDMETHOD.
METHOD HANDLE_DATA_CHANGED.
G_REFRESH = 'X'.
PERFORM EVENT_DATA_CHANGED USING ER_DATA_CHANGED
ERROR_IN_DATA
ME.
ENDMETHOD. "data_changed
ENDCLASS.
"刷新oo alv subroutine:
PERFORM REFRESH_TABLE_DISPLAY USING SENDER.
FORM REFRESH_TABLE_DISPLAY USING SENDER TYPE REF TO CL_GUI_ALV_GRID.
DATA: STBL TYPE LVC_S_STBL.
STBL-ROW = ‘X’." 基于行的稳定刷新
STBL-COL = 'X'." 基于列稳定刷新
CALL METHOD SENDER->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = STBL
I_SOFT_REFRESH = SPACE.
ENDFORM. " REFRESH_TABLE_DISPLAY
经过自己研究,可用以下方案解决:
event class 中设置 private 变量
1)
PRIVATE SECTION.
DATA G_REFRESH TYPE C.
2) 激活 DATA_CHANGED 事件. 将全局变量赋值.
METHOD HANDLE_DATA_CHANGED.
G_REFRESH = ‘X’.
ENDMETHOD. "DATA_CHANGED
3) DATA_CHANGED_FINISHED 事件中. 调用增加判断变量
METHOD DATA_CHANGED_FINISHED.
PERFORM DATA_CHANGED_FINISHED USING E_MODIFIED ET_GOOD_CELLS SENDER G_REFRESH.
ENDMETHOD. "DATA_CHANGED_FINISHED
FORM DATA_CHANGED_FINISHED USING E_MODIFIED
ET_GOOD_CELLS TYPE LVC_T_MODI
SENDER TYPE REF TO CL_GUI_ALV_GRID
REFRESH.
IF REFRESH = 'X'.
PERFORM REFRESH_TABLE_DISPLAY USING SENDER.
CLEAR REFRESH .
ENDIF.
ENDFORM. " DATA_CHANGED_FINISHED
解决思路:
首先,当我们使用标准的排序功能由于是system event 不触发user command 事件 不触发data changed事件,以及不触发data changed finished 事件
其次由于data changed finished 事件中无法获取 system event 的 ucomm ,所以无法直接判断是否刷新. cl_gui_alv_grid中的u_ucomm 是protected 属性,无法直接读取。
最后,如果我们操作内表数据(check box 选取),必然触发data changed 事件,只有触发data changed事件的动作,我们才去刷新OO ALV 内表. 直接使用system event 事件的排序功能, 必然在data changed finished 不走REFRESH_TABLE_DISPLAY ,从而不会弹出sort 窗口.
CLASS LCL_EVENTS DEFINITION.
METHODS DATA_CHANGED_FINISHED
FOR EVENT DATA_CHANGED_FINISHED OF CL_GUI_ALV_GRID
IMPORTING E_MODIFIED
ET_GOOD_CELLS
SENDER.
METHODS HANDLE_DATA_CHANGED
FOR EVENT DATA_CHANGED OF CL_GUI_ALV_GRID
IMPORTING ER_DATA_CHANGED.
PRIVATE SECTION.
DATA G_REFRESH TYPE C.
ENDCLASS.
" 类实现
CLASS LCL_APPLICATION IMPLEMENTATION.
METHOD DATA_CHANGED_FINISHED.
PERFORM DATA_CHANGED_FINISHED USING E_MODIFIED ET_GOOD_CELLS SENDER G_REFRESH.
ENDMETHOD.
METHOD HANDLE_DATA_CHANGED.
G_REFRESH = 'X'.
PERFORM EVENT_DATA_CHANGED USING ER_DATA_CHANGED
ERROR_IN_DATA
ME.
ENDMETHOD. "data_changed
ENDCLASS.
"刷新oo alv subroutine:
PERFORM REFRESH_TABLE_DISPLAY USING SENDER.
FORM REFRESH_TABLE_DISPLAY USING SENDER TYPE REF TO CL_GUI_ALV_GRID.
DATA: STBL TYPE LVC_S_STBL.
STBL-ROW = ‘X’." 基于行的稳定刷新
STBL-COL = 'X'." 基于列稳定刷新
CALL METHOD SENDER->REFRESH_TABLE_DISPLAY
EXPORTING
IS_STABLE = STBL
I_SOFT_REFRESH = SPACE.
ENDFORM. " REFRESH_TABLE_DISPLAY
经过自己研究,可用以下方案解决:
event class 中设置 private 变量
1)
PRIVATE SECTION.
DATA G_REFRESH TYPE C.
2) 激活 DATA_CHANGED 事件. 将全局变量赋值.
METHOD HANDLE_DATA_CHANGED.
G_REFRESH = ‘X’.
ENDMETHOD. "DATA_CHANGED
3) DATA_CHANGED_FINISHED 事件中. 调用增加判断变量
METHOD DATA_CHANGED_FINISHED.
PERFORM DATA_CHANGED_FINISHED USING E_MODIFIED ET_GOOD_CELLS SENDER G_REFRESH.
ENDMETHOD. "DATA_CHANGED_FINISHED
FORM DATA_CHANGED_FINISHED USING E_MODIFIED
ET_GOOD_CELLS TYPE LVC_T_MODI
SENDER TYPE REF TO CL_GUI_ALV_GRID
REFRESH.
IF REFRESH = 'X'.
PERFORM REFRESH_TABLE_DISPLAY USING SENDER.
CLEAR REFRESH .
ENDIF.
ENDFORM. " DATA_CHANGED_FINISHED
解决思路:
首先,当我们使用标准的排序功能由于是system event 不触发user command 事件 不触发data changed事件,以及不触发data changed finished 事件
其次由于data changed finished 事件中无法获取 system event 的 ucomm ,所以无法直接判断是否刷新. cl_gui_alv_grid中的u_ucomm 是protected 属性,无法直接读取。
最后,如果我们操作内表数据(check box 选取),必然触发data changed 事件,只有触发data changed事件的动作,我们才去刷新OO ALV 内表. 直接使用system event 事件的排序功能, 必然在data changed finished 不走REFRESH_TABLE_DISPLAY ,从而不会弹出sort 窗口.