ooalv自定义按钮、单击、双击、列编辑切换的事件用法
2017-09-04 14:01
2001 查看
1、需新建屏幕1001 并画container:'CONT1' 2、需新建屏幕1002 并画container:'CONT2' 3、定义屏幕1001、1002的ok_code和逻辑流 4、定义工具栏 程序代码: TABLES t001w. TYPES:BEGIN OF typ_t001w , werks TYPE t001w-werks, name1 TYPE t001w-name1, werks2 TYPE t001w-werks, rowcolor TYPE char10, zcheckbox TYPE c, "LAYOUT-CHECBOX = 'ZCHECKBOX'. * zflag TYPE c, "LAYOUT-BOX_FNAME = 'ZFLAG'. zicon TYPE char10, "LAYOUT-ICON = 'ZICON' 图标需要显示的 END OF typ_t001w. TYPES:BEGIN OF typ_smf , werks TYPE t001w-werks, name1 TYPE t001w-name1, END OF typ_smf. DATA:i_t001w TYPE TABLE OF typ_t001w,"""""第一次ALV内表 i_detail TYPE TABLE OF typ_smf, """""单击ALV内表列ZICON显示的明细ALV内表 i_smf TYPE TABLE OF typ_smf.""""SF内表 DATA:fieldcat TYPE lvc_t_fcat, grid TYPE REF TO cl_gui_alv_grid, "alv控件名 grid2 TYPE REF TO cl_gui_alv_grid, "alv控件名 g_container TYPE scrfname VALUE 'CONT1',"重新定义本地容器对象名 g_container2 TYPE scrfname VALUE 'CONT2',"重新定义本地容器对象名 is_layout TYPE lvc_s_layo, ps_layout TYPE lvc_s_layo, g_custom_container TYPE REF TO cl_gui_custom_container, g_custom_container2 TYPE REF TO cl_gui_custom_container. DATA: ui_functions TYPE ui_functions. "隐藏按钮的内表 *********ALV上事件捕捉类 DATA:gs_toolbar TYPE stb_button. "按钮 CLASS alv_event_receiver DEFINITION DEFERRED. "声明类对象 *----------------------------------------------------------------------* * CLASS alv_event_receiver DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* CLASS alv_event_receiver DEFINITION. "声明类成员可见性 PUBLIC SECTION. "定义相关类成员可以被程序中的所有对象调用 CLASS-METHODS: "静态方法 handle_toolbar "初始化工具栏对象事件,如增加按钮并设定其属性 FOR EVENT toolbar OF cl_gui_alv_grid IMPORTING e_object e_interactive, handle_menu_button "用于在下拉菜单中增加选项 FOR EVENT menu_button OF cl_gui_alv_grid IMPORTING e_object e_ucomm, handle_user_command "工具栏中的按钮的单击事件 FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm, handle_hotspot_click FOR EVENT hotspot_click OF cl_gui_alv_grid "屏幕中的单击事件,可以具体到某行某列,需要设置热点 IMPORTING e_row_id e_column_id es_row_no, handle_double_click FOR EVENT double_click OF cl_gui_alv_grid "屏幕中的双击事件,可以具体到某行某列,即使设置热点也必须双击 IMPORTING e_row e_column es_row_no. ENDCLASS. "alv_event_receiver DEFINITION *&---------------------------------------------------------------------* *& Class (Implementation) alv_event_receiver *&---------------------------------------------------------------------* * Text *----------------------------------------------------------------------* CLASS alv_event_receiver IMPLEMENTATION. "实现类方法 METHOD handle_toolbar. gs_toolbar-function = 'B_SUM'. "为按钮分配功能码 gs_toolbar-icon = icon_display. "为按钮分配图标 gs_toolbar-text = '总行数'. "为按钮分配文本 gs_toolbar-butn_type = '0'. "定义按钮类型,不填时默认为0 APPEND gs_toolbar TO e_object->mt_toolbar. "添加按钮到工具栏 gs_toolbar-function = 'B_PRINT'. "为按钮分配功能码 gs_toolbar-icon = icon_import. "为按钮分配图标 gs_toolbar-text = '转储订单打印'. "为按钮分配文本 gs_toolbar-checked = 'X'. gs_toolbar-butn_type = '0'. "定义按钮类型,不填时默认为0 APPEND gs_toolbar TO e_object->mt_toolbar. "添加按钮到工具栏 gs_toolbar-function = 'B_LIST'. "为按钮分配功能码 gs_toolbar-quickinfo = '自定义下拉菜单'. gs_toolbar-icon = icon_biw_report_view. "为按钮分配图标 gs_toolbar-text = '下拉菜单'. "为按钮分配文本 gs_toolbar-butn_type = '1'. "定义按钮类型 APPEND gs_toolbar TO e_object->mt_toolbar. "添加按钮到工具栏 gs_toolbar-function = 'B_EDIT'. "为按钮分配功能码 gs_toolbar-icon = icon_change. "为按钮分配图标 gs_toolbar-text = '切换编辑状态'. "为按钮分配文本 gs_toolbar-checked = 'X'. gs_toolbar-butn_type = '0'. "定义按钮类型,不填时默认为0 APPEND gs_toolbar TO e_object->mt_toolbar. "添加按钮到工具栏 ENDMETHOD. "handle_toolbar METHOD handle_menu_button. IF e_ucomm = 'B_LIST'. CALL METHOD e_object->add_function EXPORTING icon = icon_display fcode = 'B_SUM' text = '显示ALV总数'. ENDIF. ENDMETHOD. "handle_menu_button METHOD handle_user_command. DATA sum TYPE i. DATA text TYPE string. DATA: lwa_t001w LIKE LINE OF i_t001w. DATA: lwa_smf LIKE LINE OF i_smf. CASE e_ucomm. WHEN 'B_SUM'. DESCRIBE TABLE i_t001w[] LINES sum. text = sum. CONCATENATE '当前表格中数据的总行数:' text INTO text. MESSAGE text TYPE 'I'. "为何消息类型为 E 时运行时显示A类型,异常终止到初始界面 WHEN 'B_PRINT'. LOOP AT i_t001w INTO lwa_t001w WHERE zcheckbox = 'X'. lwa_smf-werks = lwa_t001w-werks. lwa_smf-name1 = lwa_t001w-name1. APPEND lwa_smf TO i_smf. CLEAR :lwa_t001w,lwa_smf. ENDLOOP. IF i_smf[] IS INITIAL. MESSAGE '请至少选择一行数据区打印!' TYPE 'E'. "E类型消息会转化为A类型,很蛋疼,求破! ELSE. PERFORM frm_print_data. "这个没具体写。 ENDIF. WHEN 'B_EDIT'. IF grid->is_ready_for_input( ) EQ 0. CALL METHOD grid->set_ready_for_input EXPORTING i_ready_for_input = 1. ELSE. CALL METHOD grid->set_ready_for_input EXPORTING i_ready_for_input = 0. ENDIF. WHEN OTHERS. ENDCASE. ENDMETHOD. "handle_user_command "ALV内表展示处单击事件捕捉,需要设置热点对单击列字段 METHOD handle_hotspot_click. DATA:lwa_t001w LIKE LINE OF i_t001w. READ TABLE i_t001w INTO lwa_t001w INDEX es_row_no-row_id. "判断行号 CASE e_column_id-fieldname . "判断列名 WHEN 'NAME1'. CALL TRANSACTION 'ME51N' AND SKIP FIRST SCREEN. "随便写的 WHEN 'ZICON'. " SELECT werks name1 INTO TABLE i_detail FROM t001w WHERE werks = lwa_t001w-werks2. CLEAR lwa_t001w. IF sy-subrc NE 0. MESSAGE 'No result finding!' TYPE 'I'. ELSE. CALL SCREEN 1002. ENDIF. WHEN OTHERS. ENDCASE. * MESSAGE i001(00) WITH '当前行:' es_row_no-row_id ',航线代码:' ls_lt001w-werks. ENDMETHOD. "handle_hotspot_click "ALV内表展示处双击击事件捕捉,如果设置热点双击不起作用 METHOD handle_double_click. DATA:lwa_t001w LIKE LINE OF i_t001w. READ TABLE i_t001w INTO lwa_t001w INDEX es_row_no-row_id. IF e_column-fieldname = 'WERKS'. SET PARAMETER ID 'AUN' FIELD lwa_t001w-werks. CALL TRANSACTION 'VA03' AND SKIP FIRST SCREEN. ENDIF. ENDMETHOD. "handle_double_click ENDCLASS. "alv_event_receiver START-OF-SELECTION. CALL SCREEN 1001. *&---------------------------------------------------------------------* *& Module STATUS_1001 OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE status_1001 OUTPUT. SET PF-STATUS 'T001'. * SET TITLEBAR 'xxx'. ENDMODULE. " STATUS_1001 OUTPUT *&---------------------------------------------------------------------* *& Module USER_COMMAND_1001 INPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE user_command_1001 INPUT. FIELD-SYMBOLS <field> TYPE typ_t001w . DATA: i TYPE i VALUE 0. DATA ok_code TYPE sy-ucomm. ok_code = sy-ucomm. CLEAR sy-ucomm. CASE ok_code. WHEN 'BACK'. LEAVE TO SCREEN 0. WHEN 'EDIT'. IF grid->is_ready_for_input( ) EQ 0. CALL METHOD grid->set_ready_for_input EXPORTING i_ready_for_input = 1. ELSE. CALL METHOD grid->set_ready_for_input EXPORTING i_ready_for_input = 0. ENDIF. WHEN 'EXECU'. SELECT * FROM t001w INTO CORRESPONDING FIELDS OF TABLE i_t001w. LOOP AT i_t001w ASSIGNING <field> . <field>-werks2 = <field>-werks. <field>-zicon = '@16@'. "图标 ENDLOOP. IF g_custom_container IS INITIAL. PERFORM exclude_tb_functions CHANGING ui_functions. "隐藏某些按钮 PERFORM frm_layout_set. PERFORM frm_fieldcat_set. PERFORM alv_show. ELSE. CALL METHOD grid->refresh_table_display. "刷新 ENDIF. WHEN OTHERS. ENDCASE. ENDMODULE. " USER_COMMAND_1001 INPUT *&---------------------------------------------------------------------* *& Form ALV_SHOW *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM alv_show . CREATE OBJECT g_custom_container "创建容器对象 EXPORTING container_name = g_container. CREATE OBJECT grid "创建ALV对象 EXPORTING i_parent = g_custom_container. CALL METHOD grid->register_edit_event "可编辑回传方法 EXPORTING i_event_id = grid->mc_evt_modified. CALL METHOD grid->set_table_for_first_display EXPORTING * I_BUFFER_ACTIVE = * I_BYPASSING_BUFFER = * I_CONSISTENCY_CHECK = * I_STRUCTURE_NAME = 'T001W' * IS_VARIANT = i_save = 'X' * I_DEFAULT = 'X' is_layout = is_layout * IS_PRINT = * IT_SPECIAL_GROUPS = it_toolbar_excluding = ui_functions[] * IT_HYPERLINK = * IT_ALV_GRAPHICS = * IT_EXCEPT_QINFO = * IR_SALV_ADAPTER = CHANGING it_outtab = i_t001w[] it_fieldcatalog = fieldcat[]. * IT_SORT = * IT_FILTER = * EXCEPTIONS * INVALID_PARAMETER_COMBINATION = 1 * PROGRAM_ERROR = 2 * TOO_MANY_LINES = 3 * others = 4 . ******注册ALV中引用的事件 SET HANDLER alv_event_receiver=>handle_toolbar alv_event_receiver=>handle_menu_button alv_event_receiver=>handle_user_command alv_event_receiver=>handle_hotspot_click alv_event_receiver=>handle_double_click FOR ALL INSTANCES. ****调用方法激活自定义工具对象 CALL METHOD grid->set_toolbar_interactive. ENDFORM. " ALV_SHOW *&---------------------------------------------------------------------* *& Form exclude_tb_functions *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * -->PT_EXCLUDE text *----------------------------------------------------------------------* FORM exclude_tb_functions CHANGING pt_exclude TYPE ui_functions . DATA ls_exclude TYPE ui_func. ls_exclude = cl_gui_alv_grid=>mc_fc_filter . "过滤器 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_current_variant . "布局更改 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_average ."平均值 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_mb_sum ."求和 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_mb_export . "导出 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_cut . "剪切 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_delete_row . "删除行 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_insert_row . "插入行 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_refresh . "刷新 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_find ."查找 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_sort_asc . "升序排列 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_sort_dsc . "降序排列 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_views . "视图 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_print ."打印 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_detail . "详细按钮 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_graph . "显示图形 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_info . "最终用户文档 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_append_row . "附加行 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy_row . "复制行 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_copy . "复制文本 APPEND ls_exclude TO pt_exclude. ls_exclude = cl_gui_alv_grid=>mc_fc_loc_undo . "撤消 APPEND ls_exclude TO pt_exclude. ENDFORM . "exclude_tb_functions *&---------------------------------------------------------------------* *& Form FRM_LAYOUT_SET *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_layout_set . is_layout-zebra = 'X' . is_layout-grid_title = '仓储转储订单跟踪及打印' . is_layout-smalltitle = 'X' . "ALV 控制: 标题大小 is_layout-cwidth_opt = 'X' . "优化列宽 * is_layout-no_toolbar = 'X' . "隐藏按钮 is_layout-sel_mode = 'A' . "flag选择方式 A:行和列的选择,无法选择单元格 多行,多列 B is_layout-info_fname = 'ROWCOLOR'. ENDFORM. " FRM_LAYOUT_SET *&---------------------------------------------------------------------* *& Form FRM_FIELDCAT_SET *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_fieldcat_set . DATA ls_fcat TYPE lvc_s_fcat . CLEAR ls_fcat . ls_fcat-fieldname = 'ZCHECKBOX' . ls_fcat-coltext = '选择'. * ls_fcat-emphasize = 'C601' ."列颜色控制 ls_fcat-checkbox = 'X'. ls_fcat-edit = 'X'. APPEND ls_fcat TO fieldcat . CLEAR ls_fcat . ls_fcat-fieldname = 'WERKS' . ls_fcat-inttype = 'C' . ls_fcat-outputlen = '4' . ls_fcat-coltext = '工厂'."Carrier ID.列标题 ls_fcat-seltext = 'AAA' ."ALV 控制: 对话功能的列标识符 ls_fcat-emphasize = 'C601' ."列颜色控制 * ls_fcat-hotspot = 'X'. “不能设置hotspot 否则double click事件无效 APPEND ls_fcat TO fieldcat . CLEAR ls_fcat . ls_fcat-fieldname = 'NAME1' . ls_fcat-ref_table = 'T001W' . ls_fcat-ref_field = 'NAME1' . ls_fcat-outputlen = '30' . ls_fcat-coltext = '工厂名称' . ls_fcat-hotspot = 'X'. APPEND ls_fcat TO fieldcat . CLEAR ls_fcat . ls_fcat-fieldname = 'WERKS2' . ls_fcat-inttype = 'C' . ls_fcat-outputlen = '4' . ls_fcat-coltext = '工厂2号'."Carrier ID.列标题 ls_fcat-seltext = 'AAA' ."ALV 控制: 对话功能的列标识符 ls_fcat-emphasize = 'C601' ."列颜色控制 ls_fcat-edit = 'X'. APPEND ls_fcat TO fieldcat . CLEAR ls_fcat . ls_fcat-fieldname = 'ZICON' . ls_fcat-coltext = '交货明细凭证'."Carrier ID.列标题 ls_fcat-seltext = 'AAA' ."ALV 控制: 对话功能的列标识符 ls_fcat-icon = 'X'. ls_fcat-hotspot = 'X'. APPEND ls_fcat TO fieldcat . CLEAR ls_fcat . ENDFORM. " FRM_FIELDCAT_SET *&---------------------------------------------------------------------* *& Form FRM_PRINT_DATA *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_print_data . ENDFORM. " FRM_PRINT_DATA *&---------------------------------------------------------------------* *& Module STATUS_1002 OUTPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE status_1002 OUTPUT. SET PF-STATUS 'T001'. * SET TITLEBAR 'xxx'. PERFORM frm_alv_show_detail. ENDMODULE. " STATUS_1002 OUTPUT *&---------------------------------------------------------------------* *& Form FRM_ALV_SHOW_DETAIL *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* * --> p1 text * <-- p2 text *----------------------------------------------------------------------* FORM frm_alv_show_detail . DATA: ls_fcat TYPE lvc_s_fcat , fieldcat2 TYPE lvc_t_fcat. ls_fcat-fieldname = 'WERKS' . ls_fcat-coltext = '工厂'."Carrier ID.列标题 APPEND ls_fcat TO fieldcat2 . CLEAR ls_fcat . ls_fcat-fieldname = 'NAME1' . ls_fcat-coltext = '工厂名称'. APPEND ls_fcat TO fieldcat2 . CLEAR ls_fcat . ps_layout-zebra = 'X' . ps_layout-grid_title = '交货明细凭证' . ps_layout-smalltitle = 'X' . "ALV 控制: 标题大小 ps_layout-cwidth_opt = 'X' . "优化列宽 ps_layout-no_toolbar = 'X' . "隐藏按钮 * ps_layout-SEL_MODE = 'A' . "flag选择方式 A:行和列的选择,无法选择单元格 多行,多列 B * ps_layout-info_fname = 'ROWCOLOR'. IF g_custom_container2 IS INITIAL. CREATE OBJECT g_custom_container2 "创建容器对象 EXPORTING container_name = g_container2. CREATE OBJECT grid2 "创建ALV对象 EXPORTING i_parent = g_custom_container2. ELSE. CALL METHOD grid2->refresh_table_display. "刷新 ENDIF. CALL METHOD grid2->set_table_for_first_display EXPORTING * I_BUFFER_ACTIVE = * I_BYPASSING_BUFFER = * I_CONSISTENCY_CHECK = * I_STRUCTURE_NAME = 'T001W' * IS_VARIANT = i_save = 'X' * I_DEFAULT = 'X' is_layout = ps_layout * IS_PRINT = * IT_SPECIAL_GROUPS = * IT_TOOLBAR_EXCLUDING = * IT_HYPERLINK = * IT_ALV_GRAPHICS = * IT_EXCEPT_QINFO = * IR_SALV_ADAPTER = CHANGING it_outtab = i_detail[] it_fieldcatalog = fieldcat2[]. * IT_SORT = * IT_FILTER = * EXCEPTIONS * INVALID_PARAMETER_COMBINATION = 1 * PROGRAM_ERROR = 2 * TOO_MANY_LINES = 3 * others = 4 . ENDFORM. " FRM_ALV_SHOW_DETAIL *&---------------------------------------------------------------------* *& Module USER_COMMAND_1002 INPUT *&---------------------------------------------------------------------* * text *----------------------------------------------------------------------* MODULE user_command_1002 INPUT. DATA ok_code2 TYPE sy-ucomm. ok_code2 = sy-ucomm. CLEAR sy-ucomm. CASE ok_code2. WHEN 'BACK'. LEAVE TO SCREEN 0. ENDCASE. ENDMODULE. " USER_COMMAND_1002 INPUT 复制代码 程序执行效果: 点击“明细” 跳入第二屏,更多按钮响应效果自己体验 sap系统的ooalv的学习标准程序: BCALV_EDIT_01 BCALV_EDIT_02 BCALV_EDIT_03 BCALV_EDIT_04 BCALV_EDIT_05 双击编辑单元格,更改编辑状态(ooalv 单元格控制) BCALV_EDIT_06 BCALV_EDIT_07 BCALV_EDIT_08 |
相关文章推荐
- 实现按钮的左键单击和右键单击事件 编辑框的回车键和ctrl+enter组合键消息响应
- ALV OO:单击事件-双击事件-自定义按钮事件(示例)
- Android 一个按钮两次单击触发两个不同事件并实现两个View在同一界面切换
- Flex 按钮同时监听单击和双击事件
- 安卓开发学习之014 Button应用详解(样式、背景、按钮单击、长按、双击、多击事件)
- 按钮单击双击响应事件
- C# winform程序中datagridview里按钮的单击事件
- js 同时实现单击事件和双击事件
- 同时支持行单击和双击事件的 GridView/DataGrid
- android之按钮单击事件及监听器的实现方式
- android中根据touch事件判断单击及双击
- 双击tabBar按钮事件构建
- 怎么屏蔽鼠标所有左键消息在标题栏上(鼠标双击/单击系统图标,双击标题栏,最小化,最大化,关闭按钮)
- Android view的单击,双击,长按事件监听
- GridView, DataList and ListBox 行 单击与双击事件处理
- 【Android 开发入门】为按钮添加Click单击事件处理程序,显示/隐藏另一个按钮
- Android 鼠标事件 (单击,双击,滑动)
- 自己写的鼠标单击按钮实现图片切换
- Android的按钮单击事件及监听器的5种实现方式
- 绑定与撤销回车响应按钮单击事件