我正在使用傳統的PowerBuilder應用程序,我們已升級到PowerBuilder 12,但仍繼續使用「經典」IDE。列控制PowerBuilder表達式控制奇怪的行爲
我有一個網格DataWindow與自由形式的DataWindow共享數據,它們都繼承祖先,以確保當網格中當前行發生變化時,自由形式滾動到同一行。
我已經開始在自由形式的列控件的Protect和Background.Color屬性上使用表達式來模擬啓用/禁用,作爲在rowfocuschanged上使用DataWindow.Modify的替代方法。
到目前爲止,我很喜歡這種方法,它看起來更清潔,並且沒有明顯的性能損失,因爲我沒有訪問我的任何表達式中的數據庫。
問題是,由於我難以固定的原因,這些表達式有時會導致上述行同步功能失敗。
在我的測試場景中,網格中有兩行。選擇第2行不會導致自由格式滾動到第2行,儘管調試顯示ScrollToRow確實被正常調用。然後我再次選擇第1行,不能確定這是否有效,因爲自由格式從未將第1行從第一行開始。然後,我再次選擇第2行,並且自由格式適當地滾動到第2行,從今以後,事情變得很花哨。
我通過在一個特定的表達式中移動代碼來解決這個問題,不知道爲什麼這個工作,這些更改不會影響表達式的結果。不幸的是,我沒有這麼簡單的時間來修復它在我目前的窗口。到目前爲止,我可以通過從一個特定的DateTime EditMask列中移除Protect表達式,或者通過將前面的DateTime EditMask列的TabOrder設置爲正值來解決功能喪失問題。第一列需要Protect表達式,第二列需要不可編輯。我試圖給第二列一個正面的TabOrder,同時將其保護表達式設置爲1,但沒有奏效。
我正在撕裂我的頭髮,討厭PowerBuilder的東西激烈!如果有人知道問題是什麼以及我如何繼續利用列表達式而避免它,我將不勝感激。我不願意通過從rowfocuschanged進行修改來操縱這些東西。
檢查從ScrollToRow()返回?我會仔細檢查Describe(「datawindow.firstrowonpage」)和lastrowonpage,以確保您的控件不認爲DW已經存在。一個PBDEBUG跟蹤可以確保沒有其他代碼被觸發(例如,帶有阻止返回碼的RowFocusChanging)可能是一個想法(調試器是侵入性的,並且可以改變事件序列)。只要頭腦風暴,在ScrollToRow()之前嘗試SetColumn()到一個不受保護的列。 (這裏有沒有SetRow()?)記住12.5會給你啓用屬性,所以保持你的方法模塊化和兼容。 – Terry 2011-12-30 16:06:04
感謝您的及時回覆!在dw_grid.rowfocuschanged中有代碼可以執行dw_freeform.ScrollToRow(currentrow)。我添加了代碼來捕獲返回值,當問題發生時它返回1,但currentrow是2!我也注意到在dw_freeform.rowfocuschanging中我的斷點沒有被擊中。我會嘗試你的其他建議。 – Mike 2011-12-30 18:17:59
因此,在dw_grid.retrieveend上,我做了一個dw_freeform.SetColumn,我唯一的列總是沒有保護,它的工作,非常感謝你!我很好奇,是什麼讓你想到的,是什麼時候評估表達式和是否設置了列之間的關係? – Mike 2011-12-30 18:29:48