Как обработать событие нажатия кнопки DDDW? - PullRequest
1 голос
/ 13 апреля 2019

Ситуация : У меня есть кнопка в моем DDDW, и я хочу захватить событие, нажатие кнопки.

Проблема : когда я нажимаю на кнопку в DDDW, событие нажатия кнопки DWC не запускается, а событие ItemChanged запускается для управления DW.

Вопрос: Как записать событие clickclicked для кнопки в DDDW?Или есть какой-нибудь другой способ, которым я могу удалить строку из DDDW при нажатии кнопки удаления для определенной строки?

enter image description here

PowerBuilder 12.5

1 Ответ

1 голос
/ 25 мая 2019

Согласно справке PB, DataWindowChild не имеет событий: |

Но это не значит, что мы все еще не можем подключиться к нему через событие itemchanged элемента управления DW. Примечание: это взлом, который прошел очень ограниченное тестирование.Но, я думаю, это демонстрирует точку.

Вот что я сделал:

  • Создал DataWindow со столбцами code и name и вычисляемым полем (длякрасный X) с именем delete_button
  • создал другое окно данных и нарисовал там этот DW как DDDW с именем profession
  • В событии open элемента управления моего окна я получил DDDWиз DW и вставил его в переменную экземпляра: dw_1.GetChild("profession", REF idwc_profession)
  • Затем закодировал событие itemchanged для элемента управления DW:
    // dw_1::itemchanged
    //
    //  - DDDW is named "profession"
    IF dwo.Name = "profession" THEN
        IF IsValid(idwc_profession) THEN
            string ls_clickedobject
            // Get the DataWindowCHILD object where the pointer was clicked:
            ls_clickedobject = idwc_profession.GetObjectAtPointer()

            IF IsNull(ls_clickedObject) OR (ls_clickedobject = "") THEN RETURN

            // Return from GetChild is <column name>~t<row number>; let's get
            // the position of the tab character so we can parse it
            long ll_tabPos
            ll_tabPos = Pos(ls_clickedObject, "~t")

            IF ll_tabPos > 0 THEN
                string ls_clickedDddwColumn

                ls_clickedDddwColumn = Trim(Left(ls_clickedObject, ll_tabPos - 1))
                // Check to see if we've clicked on the computed field with the delete button
                IF Lower(ls_clickedDddwColumn) = "delete_button" THEN
                    long ll_clickedDddwRow
                    // grab the row we want to delete
                    ll_clickedDddwRow = Long(Trim(Right(ls_clickedObject, Len(ls_clickedObject) - ll_tabPos)))

                    IF ll_clickedDddwRow > 0 THEN
                        // delete the row from the DDDW
                        idwc_profession.DeleteRow(ll_clickedDddwRow)

                        SetNull(data) // reset our data
                    END IF
                END IF
            END IF
        END IF
    END IF

RETURN

Также обратите внимание, что вы можетепридется поиграть с возвращаемым значением из itemchanged, чтобы заставить его делать то, что вы хотите.И, если вы захотите автоматически сбросить DDDW снова после того, как удаление произойдет, вы могли бы использовать для этого метод Send() (хотя я не знаю правильного «числа» для этого, хотя).

...