如何处理DDDW的buttonclicked事件?
How to handle buttonclicked event of DDDW?
情况:
我的 DDDW 中有一个按钮,我想捕获 buttonclicked 事件。
问题:
当我点击 DDDW 中的按钮时,DW 控件的 buttonclicked 事件没有被触发,而 ItemChanged 事件被触发用于 DW 控件。
问题:
如何捕获 DDDW 中按钮的按钮点击事件?或者有没有其他方法可以在为特定行单击删除按钮时从 DDDW 中删除一行?
PowerBuilder 12.5
根据PB帮助,DataWindowChild没有事件:|
但是,这并不意味着我们仍然无法通过 DW 控件的 itemchanged
事件连接到它。 注意: 这是一个 hack,并经过了一些 very-limited 测试。但是,我想这说明了一点。
这是我所做的:
- 创建了一个包含
code
和 name
列的数据窗口,以及一个名为 delete_button
的计算字段(对于红色 X)
- 创建了另一个 DataWindow 并将该 DW 绘制为 DDDW,命名为
profession
- 在我的 window 控件的
open
事件中,我从 DW 获取了 DDDW 并将其保存在一个实例变量中:
dw_1.GetChild("profession", REF idwc_profession)
- 然后,为 DW 控件编写
itemchanged
事件:
// 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
中的 return 值才能使其执行您想要的操作。而且,如果你想在删除发生后再次自动下拉 DDDW,你可以使用 Send()
方法来做到这一点(我不知道正确的 "number",虽然)。
情况: 我的 DDDW 中有一个按钮,我想捕获 buttonclicked 事件。
问题: 当我点击 DDDW 中的按钮时,DW 控件的 buttonclicked 事件没有被触发,而 ItemChanged 事件被触发用于 DW 控件。
问题: 如何捕获 DDDW 中按钮的按钮点击事件?或者有没有其他方法可以在为特定行单击删除按钮时从 DDDW 中删除一行?
PowerBuilder 12.5
根据PB帮助,DataWindowChild没有事件:|
但是,这并不意味着我们仍然无法通过 DW 控件的 itemchanged
事件连接到它。 注意: 这是一个 hack,并经过了一些 very-limited 测试。但是,我想这说明了一点。
这是我所做的:
- 创建了一个包含
code
和name
列的数据窗口,以及一个名为delete_button
的计算字段(对于红色 X)
- 创建了另一个 DataWindow 并将该 DW 绘制为 DDDW,命名为
profession
- 在我的 window 控件的
open
事件中,我从 DW 获取了 DDDW 并将其保存在一个实例变量中:dw_1.GetChild("profession", REF idwc_profession)
- 然后,为 DW 控件编写
itemchanged
事件:
// 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
中的 return 值才能使其执行您想要的操作。而且,如果你想在删除发生后再次自动下拉 DDDW,你可以使用 Send()
方法来做到这一点(我不知道正确的 "number",虽然)。