급조로 필드 2개짜리 alv 를 예제로 만들었습니다.
event receiver 를 여기서 만드는 것으로 했기 때문에
그쪽에서 쓰시는 방법으로 선언만 하시면 될 거예요.
프로그램은 체크박스에 체크/언체크 시 value 필드에 1씩 값을 증가하게
했습니다.
도움이 되시길 바랍니다.
DATA g_okcode TYPE syucomm.
DATA : BEGIN OF gs_data,
check1,
value TYPE i,
END OF gs_data.
DATA gt_data LIKE TABLE OF gs_data.
DATA gs_layout TYPE lvc_s_layo.
DATA gt_fcat TYPE lvc_t_fcat.
DATA g_grid TYPE REF TO cl_gui_alv_grid.
DATA g_stable TYPE lvc_s_stbl VALUE 'XX'.
START-OF-SELECTION.
APPEND gs_data TO gt_data.
CALL SCREEN 100.
*&---------------------------------------------------------------------*
*& Module STATUS OUTPUT
*&---------------------------------------------------------------------*
MODULE status OUTPUT.
SET PF-STATUS 'PF100'.
SET TITLEBAR 'T100'.
ENDMODULE. " STATUS OUTPUT
*&---------------------------------------------------------------------*
*& Module EXIT INPUT
*&---------------------------------------------------------------------*
MODULE exit INPUT.
LEAVE TO SCREEN 0.
ENDMODULE. " EXIT INPUT
*&---------------------------------------------------------------------*
*& Module USER_COMMAND INPUT
*&---------------------------------------------------------------------*
MODULE user_command INPUT.
CASE g_okcode.
WHEN ''.
WHEN OTHERS.
ENDCASE.
CLEAR g_okcode.
ENDMODULE. " USER_COMMAND INPUT
*&---------------------------------------------------------------------*
*& Module SET_GRID OUTPUT
*&---------------------------------------------------------------------*
MODULE set_grid OUTPUT.
IF g_grid IS NOT BOUND.
* Create grid control
CREATE OBJECT g_grid
EXPORTING
i_parent = cl_gui_container=>default_screen.
* Set layout.
gs_layout-cwidth_opt = 'X'.
* Set field-catalog
PERFORM set_fcat CHANGING gt_fcat.
* Display grid
g_grid->set_table_for_first_display(
EXPORTING
is_layout = gs_layout
CHANGING
it_outtab = gt_data
it_fieldcatalog = gt_fcat
).
* Set grid-event
PERFORM set_event_for_grid CHANGING g_grid.
ELSE.
g_grid->refresh_table_display( is_stable = g_stable ).
ENDIF.
ENDMODULE. " SET_GRID OUTPUT
*&---------------------------------------------------------------------*
*& Form SET_EVENT_FOR_GRID
*&---------------------------------------------------------------------*
FORM set_event_for_grid CHANGING cl_grid TYPE REF TO cl_gui_alv_grid.
DATA lcl_event TYPE REF TO zcl_km_event_receiver.
CREATE OBJECT lcl_event.
SET HANDLER lcl_event->handle_data_changed FOR cl_grid.
cl_grid->register_edit_event(
EXPORTING i_event_id = cl_grid->mc_evt_modified
).
ENDFORM. " SET_EVENT_FOR_GRID
*&---------------------------------------------------------------------*
*& Form handle_double_click
*&---------------------------------------------------------------------*
FORM handle_data_changed
CHANGING sender TYPE REF TO cl_gui_alv_grid
er_data_changed TYPE REF TO cl_alv_changed_data_protocol
e_onf4
e_onf4_before
e_onf4_after
e_ucomm.
FIELD-SYMBOLS : <lfs_mod_cell> TYPE lvc_s_modi,
<lfs_fcat> TYPE lvc_s_fcat.
READ TABLE er_data_changed->mt_mod_cells
ASSIGNING <lfs_mod_cell>
INDEX 1.
CHECK sy-subrc IS INITIAL.
CLEAR gt_fcat.
READ TABLE gt_data INTO gs_data INDEX <lfs_mod_cell>-row_id.
IF sy-subrc IS INITIAL.
ADD 1 TO gs_data-value.
MODIFY gt_data FROM gs_data INDEX sy-tabix TRANSPORTING value.
sender->refresh_table_display( is_stable = g_stable ).
ENDIF.
ENDFORM. "handle_double_click
*&---------------------------------------------------------------------*
*& Form SET_FCAT
*&---------------------------------------------------------------------*
FORM set_fcat CHANGING ct_fcat TYPE lvc_t_fcat.
DATA ls_fcat TYPE lvc_s_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'CHECK1'.
ls_fcat-checkbox = 'X'.
ls_fcat-edit = 'X'.
ls_fcat-coltext = 'CheckBox 1'.
ls_fcat-tooltip = 'CheckBox 1'.
ls_fcat-seltext = 'CheckBox 1'.
ls_fcat-outputlen = 10.
*
APPEND ls_fcat TO ct_fcat.
CLEAR ls_fcat.
ls_fcat-fieldname = 'VALUE'.
ls_fcat-checkbox = ' '.
ls_fcat-edit = ' '.
ls_fcat-coltext = 'Value'.
ls_fcat-tooltip = 'Value'.
ls_fcat-seltext = 'Value'.
ls_fcat-outputlen = 10.
APPEND ls_fcat TO ct_fcat.
ENDFORM. " SET_FCAT
댓글 4
-
요요
2009.11.19 03:08
-
쭌수야~!
2009.11.19 18:07
요요님~! 일부러 시간까지 내어 프로그램을 짜주시다니... 정말 감사합니다.
출근하자 마자 바로 해보았는데,
위 소스의 체크박스 처리.... 잘 되네요. ㅜ.ㅡ (아~ 허무해...)
제 소스와 비교해 보아도 별 차이가 없는데 제 프로그램은 왜 안될까요...
더욱 열받는건 일년전쯤 짠 프로그램중에는 잘 되는것도 있다라는.... 흑흑
천천히 다시 비교해 보아야겠습니다.
감사합니다.
-
eskang
2009.11.21 07:25
checkbox의 data change메소드는 해결을 하지 못했지만 많이 도와준 분들께 감사드립니다. 많은 참조가 됬어요..
그리고,, Hotspot를 이용해서 해결했어요... 감사합니다...
-
쭌수야~!
2009.11.24 01:55
에고... eskang 님 hotspot을 사용하셨군요...
제가 무지해서 알려드린 방법을 쓰셨다니... 기분이 쫌... ^^;;;
위에 있는 요요님이 올려주신 소스를 보시면
FORM set_event_for_grid 에서
cl_grid->register_edit_event(
EXPORTING i_event_id = cl_grid->mc_evt_modified
).
이걸 적용하시면 별다른 고생하시지 않고 처리하시지 않아도 data_changed 를 탈거에요...
(... 저처럼 경우에 따라 잘 되지 않는경우도 있을지 모르지만... ^^;; 어딘가 제가 실수를 해놓았겠지요... )
data_changed 에서 현재 필드 점검하여 다음 필드에 대한 style 정의만 해주시면 될 것 같네요.