Событие для щелчка заголовка в сетке ALV?

Можно ли поймать нажатие одной кнопки на заголовке столбца ALV Grid? Я знаю о возможности поймать double_click, создать событие для хотспота на ячейке. Я еще не нашел ни одного клика по заголовку. (Я не хочу предоставлять сортировку или любые другие параметры данных). Единственное, что я нашел, это событие click_col_header OF cl_gui_alv_grid, но оно защищено, поэтому я не могу предоставить свое действие. Заранее спасибо !


person bagere    schedule 09.11.2018    source источник
comment
защищенный означает, что вы можете использовать его, создав локальный класс, наследуемый от CL_GUI_ALV_GRID, и реагируя на событие в этом локальном классе.   -  person Sandra Rossi    schedule 09.11.2018
comment
Если вам нужен один щелчок, вы должны использовать точку доступа   -  person fabiopagoti    schedule 09.11.2018
comment
но hotsport - это событие для одного щелчка по конкретной ячейке, а не по заголовку..   -  person bagere    schedule 09.11.2018


Ответы (1)


да. Вот как это сделать с CL_GUI_ALV_GRID:

  • Установите параметр макета ALV SGL_CLK_HD = 'X' (это активирует сортировку строк на основе столбца, на который нажали)
  • Переопределите поведение сортировки с помощью собственного кода, обработав событие BEFORE_USER_COMMAND и задав новую команду с помощью метода SET_USER_COMMAND
  • Определите новое поведение, которое вы хотите во время события USER_COMMAND
  • Используйте метод GET_SELECTED_COLUMNS, чтобы узнать, какой столбец был нажат

(PS: если интересно, CL_GUI_ALV_GRID имеет событие CLICK_COL_HEADER, но оно никогда не срабатывает)

Вот демонстрация (также размещенная ниже ответа Рэймонда в форум SAP):

CLASS lcl_alv DEFINITION.
  PUBLIC SECTION.
    METHODS constructor.
    METHODS free.
    METHODS on_before_user_command FOR EVENT before_user_command OF cl_gui_alv_grid IMPORTING e_ucomm.
    METHODS on_user_command FOR EVENT user_command OF cl_gui_alv_grid IMPORTING e_ucomm.
    DATA go_alv TYPE REF TO cl_gui_alv_grid.
    DATA gt_sflight TYPE TABLE OF sflight.
ENDCLASS.

CLASS lcl_alv IMPLEMENTATION.

  METHOD constructor.
    CREATE OBJECT go_alv
      EXPORTING
        i_parent = cl_gui_container=>screen0.

    SET HANDLER on_user_command FOR go_alv.
    SET HANDLER on_before_user_command FOR go_alv.

    SELECT * FROM sflight INTO TABLE gt_sflight.
    go_alv->set_table_for_first_display(
        EXPORTING
          i_structure_name = 'SFLIGHT'
          is_layout = VALUE #( sgl_clk_hd = abap_true )
        CHANGING
          it_outtab = gt_sflight ).
  ENDMETHOD.

  METHOD free.
    go_alv->free( ).
  ENDMETHOD.

  METHOD on_before_user_command.
    CASE e_ucomm.
      WHEN go_alv->mc_fc_sort.
        go_alv->set_user_command( i_ucomm = 'ZZSORT' ).
    ENDCASE.
  ENDMETHOD.

  METHOD on_user_command.
    CASE e_ucomm.
      WHEN 'ZZSORT'.
        go_alv->get_selected_columns( IMPORTING et_index_columns = data(columns) ).
        MESSAGE |Columns: { COND #( WHEN lines( columns ) > 0 THEN columns[ 1 ]-fieldname ) }| TYPE 'I'.
    ENDCASE.
  ENDMETHOD.

ENDCLASS.

DATA go_alv TYPE REF TO lcl_alv.

PARAMETERS dummy.

AT SELECTION-SCREEN OUTPUT.
  IF go_alv IS NOT BOUND.
    go_alv = NEW lcl_alv( ).
  ENDIF.

AT SELECTION-SCREEN ON EXIT-COMMAND.
  go_alv->free( ).
  FREE go_alv.
person Sandra Rossi    schedule 10.11.2018