Согласно справке 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()
(хотя я не знаю правильного «числа» для этого, хотя).