如何处理DDDW的buttonclick事件?

时间:2019-04-13 12:19:14

标签: button powerbuilder datawindow

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

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

问题: 如何捕获DDDW中按钮的buttonclicked事件?还是当单击特定行的删除按钮时,我还有其他方法可以从DDDW中删除行吗?

enter image description here

PowerBuilder 12.5

1 个答案:

答案 0 :(得分:1)

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

但是,这并不意味着我们仍然无法通过DW控件的itemchanged事件来加入它。 注意:这是一个骇客,并且经过了非常有限的测试。但是,我想这表明了一点。

这就是我所做的:

  • 使用codename列创建一个DataWindow,并创建一个名为delete_button的计算字段(红色X)
  • 创建了另一个DataWindow并将该DW绘制为名为profession的DDDW
  • 在窗口控件的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的返回值才能使其执行所需的操作。而且,如果您希望在删除发生后再次自动降DDDW,则可以使用Send()方法(尽管我不知道正确的“数字”)