情况: 我的DDDW中有一个按钮,我想捕获buttonclicked事件。
问题: 当我单击DDDW中的按钮时,不会触发DW控件的buttonclicked事件,而为DW控件触发ItemChanged事件。
问题: 如何捕获DDDW中按钮的buttonclicked事件?还是当单击特定行的删除按钮时,我还有其他方法可以从DDDW中删除行吗?
PowerBuilder 12.5
答案 0 :(得分:1)
根据PB帮助,DataWindowChild没有事件:|
但是,这并不意味着我们仍然无法通过DW控件的itemchanged
事件来加入它。 注意:这是一个骇客,并且经过了非常有限的测试。但是,我想这表明了一点。
这就是我所做的:
code
和name
列创建一个DataWindow,并创建一个名为delete_button
的计算字段(红色X)profession
的DDDW open
事件中,我从DW获取了DDDW并将其粘贴在实例变量中:
dw_1.GetChild("profession", REF idwc_profession)
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
的返回值才能使其执行所需的操作。而且,如果您希望在删除发生后再次自动降DDDW,则可以使用Send()
方法(尽管我不知道正确的“数字”)