【转载】OO ALV-单击事件,双击事件,添加自定义按钮事件(EVENT)实例

OO ALV中经常会用的行单击,行双击,application tool bar上添加按钮以及按钮的相应事件,如下:

1,单击:handle_hotspot_click 事件

2,双击:handle_double_click

3,工具栏上添加自定按钮: handle_toolbar,其中,butn_type = 3. 是分隔符详细参照下面代码

4, 自定义按钮相应事件:handle_command

这些事件需要用SET HANDLER先注册,然后再在类中实现,添加自己的逻辑。

下面是个完整代码以及相关屏幕的创建过程:

1) 创建0100屏幕

屏幕PAI,PBO中流逻辑代码

 

1

2

3

4

5

6

PROCESS BEFORE OUTPUT.

  MODULE STATUS_0100.

  MODULE INIT_CON.

PROCESS AFTER INPUT.

MODULE USER_EXIT_0100 AT EXIT-COMMAND.

2017-02-27_13-52-59

2)  在0100屏幕上画自定义控件,命名为CUS01

在屏幕点击下面红框内的按钮创建控件CUS01.

2017-02-27_13-21-07

3,程序中的Status

2017-02-27_13-47-59

4,程序代码

 

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

REPORT ZTEST_OO_ALV_EVENT.

 

DATA: gs_data TYPE spfli.

 

DATA: gt_data LIKE TABLE OF gs_data.

 

DATA: g_con01  TYPE REF TO cl_gui_custom_container.

 

DATA: g_grid01 TYPE REF TO cl_gui_alv_grid.

 

DATA: gs_fieldcat TYPE lvc_s_fcat.

DATA: gt_fieldcat TYPE lvc_t_fcat.

 

CONSTANTS: g_cus01 TYPE scrfname VALUE 'CUS01'.

 

*----------------------------------------------------------------------*

*       CLASS cl_event_receiver DEFINITION

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

CLASS cl_event_receiver DEFINITION.

  PUBLIC SECTION.

    " 声明单击事件的方法

    METHODS handle_hotspot_click

      FOR EVENT hotspot_click OF cl_gui_alv_grid

      IMPORTING e_row_id e_column_id.

    " 声明双击事件方法

    METHODS handle_double_click

      FOR EVENT double_click OF cl_gui_alv_grid

      IMPORTING e_row e_column.

    " 声明Toolbar事件方法

    METHODS handle_toolbar

      FOR EVENT toolbar OF cl_gui_alv_grid

      IMPORTING e_object e_interactive.

    " 声明USER-COMMAND 事件方法

    METHODS handle_command

      FOR EVENT user_command OF cl_gui_alv_grid

      IMPORTING e_ucomm.

ENDCLASS.                    "cl_event_receiver DEFINITION

 

*----------------------------------------------------------------------*

*       CLASS cl_event_receiver IMPLEMENTATION

*----------------------------------------------------------------------*

*

*----------------------------------------------------------------------*

CLASS cl_event_receiver IMPLEMENTATION.

  " 单击事件方法的实现

  METHOD handle_hotspot_click.

    CONDENSE e_row_id     NO-GAPS.

    CONDENSE e_column_id  NO-GAPS.

    MESSAGE i001(00) WITH '单击事件->行号:' e_row_id  '、列名:' e_column_id.

  ENDMETHOD.                    "handle_HOTSPOT_CLICK

  " 双击事件方法的实现

  METHOD handle_double_click.

    CONDENSE e_row     NO-GAPS.

    CONDENSE e_column  NO-GAPS.

    MESSAGE i001(00) WITH '双击事件->行号:' e_row  '、列名:' e_column.

  ENDMETHOD.                    "handle_double_click

  " 实现Toolbar事件方法

  METHOD handle_toolbar.

    DATA: ls_toolbar TYPE stb_button.

    CLEAR: ls_toolbar.

    ls_toolbar-butn_type = 3. " 分隔符

    APPEND ls_toolbar TO e_object->mt_toolbar.

    CLEAR: ls_toolbar.

    ls_toolbar-function = 'DISP'.    " 功能码

    ls_toolbar-icon = icon_display.  " 图标名称

    ls_toolbar-quickinfo = '显示'.   " 图标的提示信息

    ls_toolbar-butn_type = 0.        " 0表示正常按钮

    ls_toolbar-disabled = ''.        " X表示灰色,不可用

    ls_toolbar-text = '按钮1'.       " 按钮上显示的文本

    APPEND ls_toolbar TO e_object->mt_toolbar.

  ENDMETHOD.                    "handle_toolbar

  " 实现USER-COMMAND 事件方法

  METHOD handle_command.

    CASE e_ucomm.

      WHEN 'DISP'.

        MESSAGE i001(00) WITH 'Toolbar事件 + USER-COMMAND事件 '.

    ENDCASE.

  ENDMETHOD.                    "HANDLE_COMMAND

 

ENDCLASS.                    "cl_event_receiver IMPLEMENTATION

DATA: event_receiver TYPE REF TO cl_event_receiver.

 

START-OF-SELECTION.

  PERFORM get_data.

 

  CALL SCREEN 100.

 

*&---------------------------------------------------------------------*

*&      Form  GET_DATA

*&---------------------------------------------------------------------*

*       text  获取数据

*----------------------------------------------------------------------*

FORM get_data.

  SELECT *

    INTO CORRESPONDING FIELDS OF TABLE gt_data

    UP TO 30 ROWS

    FROM spfli.

 

ENDFORM.                    "GET_DATA

 

*&---------------------------------------------------------------------*

*&      Form  SET_FIELDCAT

*&---------------------------------------------------------------------*

*       text  ALV显示字段文本

*----------------------------------------------------------------------*

FORM set_fieldcat.

  CLEAR: gt_fieldcat[].

  DEFINE macro_fieldcat.

    clear gs_fieldcat.

    gs_fieldcat-fieldname = &1.

    gs_fieldcat-coltext   = &2.

    gs_fieldcat-hotspot   = &3.

    append gs_fieldcat to gt_fieldcat.

  END-OF-DEFINITION.

 

  macro_fieldcat 'CARRID'     '航线代码'   'X'.

  macro_fieldcat 'CONNID'     '航班连接Id' ''.

  macro_fieldcat 'COUNTRYFR'  '起飞国家'   ''.

  macro_fieldcat 'CITYFROM'   '起飞城市'   ''.

  macro_fieldcat 'AIRPFROM'   '起飞机场'   ''.

  macro_fieldcat 'COUNTRYTO'  '目标国家'   ''.

  macro_fieldcat 'CITYTO'     '目标城市'   ''.

  macro_fieldcat 'AIRPTO'     '目标机场'   ''.

  macro_fieldcat 'FLTIME'     '航班时间'   ''.

  macro_fieldcat 'DEPTIME'    '启程时间'   ''.

  macro_fieldcat 'ARRTIME'    '到达时间'   ''.

  macro_fieldcat 'DISTANCE'   '距离'       ''.

 

ENDFORM.                    "SET_FIELDCAT

 

*&---------------------------------------------------------------------*

*&      Form  SET_LAYOUT

*&---------------------------------------------------------------------*

*       text  布局

*----------------------------------------------------------------------*

*      -->P_LAYOUT   text

*----------------------------------------------------------------------*

FORM set_layout CHANGING p_layout TYPE lvc_s_layo.

  p_layout-cwidth_opt = 'X'.   " 自动调节字段长度

  p_layout-sel_mode   = 'D'.   " 选择模式,可选择多行

  p_layout-zebra      = 'X'.   " 颜色交替显示

ENDFORM.                      "SET_LAYOUT

 

*&---------------------------------------------------------------------*

*&      Module  INIT_CON  OUTPUT

*&---------------------------------------------------------------------*

*       text  创建ALV

*----------------------------------------------------------------------*

MODULE init_con OUTPUT.

 

  DATA: ls_layout TYPE lvc_s_layo.

 

  IF g_con01 IS INITIAL.

    PERFORM set_fieldcat.

    PERFORM set_layout CHANGING ls_layout.

 

    " 创建SAP容器实例

    CREATE OBJECT g_con01

      EXPORTING

        container_name              = g_cus01 " 自定义控件名称

      EXCEPTIONS

        cntl_error                  = 1

        cntl_system_error           = 2

        create_error                = 3

        lifetime_error              = 4

        lifetime_dynpro_dynpro_link = 5

        OTHERS                      = 6.

    IF sy-subrc <> 0.

      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

    ENDIF.

    " 创建GRID实例

    CREATE OBJECT g_grid01

      EXPORTING

        i_parent          = g_con01

      EXCEPTIONS

        error_cntl_create = 1

        error_cntl_init   = 2

        error_cntl_link   = 3

        error_dp_create   = 4

        OTHERS            = 5.

    IF sy-subrc <> 0.

      MESSAGE ID sy-msgid TYPE sy-msgty NUMBER sy-msgno

                 WITH sy-msgv1 sy-msgv2 sy-msgv3 sy-msgv4.

    ENDIF.

 

    CREATE OBJECT event_receiver.

    " 注册事件handler方法

    SET HANDLER event_receiver->handle_hotspot_click  FOR g_grid01.

    SET HANDLER event_receiver->handle_double_click   FOR g_grid01.

    SET HANDLER event_receiver->handle_toolbar FOR g_grid01.

    SET HANDLER event_receiver->handle_command FOR g_grid01.

 

    " 调用ALV 显示方法

    CALL METHOD g_grid01->set_table_for_first_display

      EXPORTING

*       i_structure_name              = 'SPFLI' " 参照表结构字段显示

        is_layout                     = ls_layout " 布局

      CHANGING

        it_fieldcatalog               = gt_fieldcat " 显示字段

        it_outtab                     = gt_data[]

      EXCEPTIONS

        invalid_parameter_combination = 1

        program_error                 = 2

        too_many_lines                = 3

        OTHERS                        = 4.

    IF sy-subrc <> 0.

*     Implement suitable error handling here

    ENDIF.

 

  ENDIF.

 

ENDMODULE.                 " INIT_CON  OUTPUT

 

*&---------------------------------------------------------------------*

*&      Module  STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*

*       text  工具条

*----------------------------------------------------------------------*

MODULE status_0100 OUTPUT.

  SET PF-STATUS 'S0001'.

 

ENDMODULE.                 " STATUS_0100  OUTPUT

*&---------------------------------------------------------------------*

*&      Module  USER_EXIT_0100  INPUT

*&---------------------------------------------------------------------*

*       text  取消事件

*----------------------------------------------------------------------*

MODULE user_exit_0100 INPUT.

  LEAVE TO SCREEN 0.

ENDMODULE.                 " USER_EXIT_0100  INPUT

5,运行效果

2017-02-27_13-49-33

2017-02-27_13-50-06

2017-02-27_13-50-33

以上

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值