如何处理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 测试。但是,我想这说明了一点。

这是我所做的:

  • 创建了一个包含 codename 列的数据窗口,以及一个名为 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",虽然)。