首页 > 解决方案 > 如何处理 DDDW 的 buttonclicked 事件?

问题描述

情况:我的 DDDW 中有一个按钮,我想捕获 buttonclicked 事件。

问题:当我单击 DDDW 中的按钮时,不会触发 DW 控件的 buttonclicked 事件,并且会为 DW 控件触发 ItemChanged 事件。

问题:如何为 DDDW 中的按钮捕获 buttonclicked 事件?或者当单击特定行的删除按钮时,我有什么其他方法可以从 DDDW 中删除一行?

在此处输入图像描述

PowerBuilder 12.5

标签: buttonpowerbuilderdatawindow

解决方案


根据 PB 帮助,DataWindowChild 没有事件:|

但是,这并不意味着我们仍然不能通过 DW 控件的itemchanged事件来挂钩它。 注意:这是一个 hack,并且经过了一些非常有限的测试。但是,它证明了一点,我猜。

这是我所做的:

  • 创建了一个包含codename列的 DataWindow,以及一个名为delete_button
  • 创建了另一个 DataWindow 并将该 DW 绘制为 DDDW,命名为profession
  • 在我的窗口控件open事件中,我从 DW 获得了 DDDW 并将其粘贴在一个实例变量中: 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

另请注意,您可能必须使用 from 的返回值itemchanged才能使其执行您想要的操作。而且,如果您想在删除发生后再次自动下拉 DDDW,您可能可以使用该Send()方法来执行此操作(不过,我不知道正确的“数字”)。


推荐阅读