翻點舊帖,文本框的Refresh問題
以下是引用excel2007在2009-9-21 14:31:07的发言:
表单上有两个文本框text1\text2,其中text1绑定students表的“姓名”字段,我在text1的refresh事件中加入:
thisform.text2.Value=this.Value
当运行时,为什么text2中显示的内容却是text1的上一条内容,如何让它们显示的内容一致?
表单上有两个文本框text1\text2,其中text1绑定students表的“姓名”字段,我在text1的refresh事件中加入:
thisform.text2.Value=this.Value
当运行时,为什么text2中显示的内容却是text1的上一条内容,如何让它们显示的内容一致?
這是不熟悉文本框綁定動作次序造成的問題。解決的辦法有多種,最保險的如下:
程序代码:
* Text1的Init事件代碼 PROCEDURE Text1.Init This.ControlSource = "students.姓名" ENDPROC * 表單的Refresh代碼 PROCEDURE Refresh ThisForm.Text2.Value = ThisForm.Text1.Value ENDPROC
程序的運行順序是這樣的:控件的Refresh事件,在控件內容被改變時發生,因為Text1是綁定字段的,所以必定是字段値發生了改變,觸發Text1的Refresh事件,但此時還未改變Text1.Value的値,它要在Refresh事件運行結束前一瞬間才完成,但你正好在完成之前,把Text1.Value的舊値賦給了Text2.Value,在這個動作之後,Text1控件執行完了你自定的Refresh代碼,才執行它本身固有的代碼(類代碼中的::行為,有前置和後置兩種方式,這是另一種解決問題的思路,在Text1.Refresh代碼中置入DODEFAULT()語句,在前或在後),將Text1.Value更新爲字段的値。
寫程序的人,必須要弄明白這種因果關係,才談得上改錯。我上面代碼的解決思路是:表單的Refresh事件總是在它包含的所有控件Refresh完成之後才啓動,此時,Text1和Text2的Refresh事件都已經執行完成,這樣,我們只要最後強制一次令Text2.Value = Text1.Value,則可保證兩個TextBox控件的値相等。
但有一點是必須注意的:Text2不能也綁定到某個字段中!為什麼?可以自己思考一下。
[ 本帖最后由 TonyDeng 于 2011-7-4 00:43 编辑 ]