| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 478 人关注过本帖
标题:翻點舊帖,文本框的Refresh問題
只看楼主 加入收藏
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:2 
翻點舊帖,文本框的Refresh問題
以下是引用excel2007在2009-9-21 14:31:07的发言:

表单上有两个文本框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 编辑 ]
搜索更多相关主题的帖子: 表单 姓名 文本框 Text1 如何 
2011-07-04 00:27
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
上面用Refesh方法,其實還不保證效果,因為每個控件Refresh的順序是不確定的,而且Refresh既是事件、又是方法,它有點被動(只在有需要時才啓動,而是否需要卻由VFP自己決定,除非你將它當方法主動調用),無法實時反映效果。

改用InteractiveChange事件,才會實時動作,只要Text1.Value有任何變動,不管它是受字段改變引起的還是被手動輸入改變的,這個事件一定會觸發,那麽就可以馬上令兩個文本框的顯示同步,這樣,你在Text1敲鍵的時候,Text2就會跟著變化,就像你同時在兩個文本框輸入一樣。

順便說一下,其實在接受交互式輸入的控件中綁定數據庫字段,並不是什麽値得提倡的事。獨佔數據庫沒有問題,在共享模式下,最好謹慎設置鎖定動作,這樣做很容易造成死鎖的。一旦解除字段綁定,這個問題好解決多了。(其實我也不明白這樣兩個文本框的設計到底是怎麽回事,怎麽會有這種需要的呢?)

授人以渔,不授人以鱼。
2011-07-04 12:32
lyxc34
Rank: 2
等 级:论坛游民
帖 子:139
专家分:50
注 册:2011-7-3
收藏
得分:20 
  TEXT文本框本来就是设计用来交互时接收数据的,而绑定字段相当于是用它来显示字段,有点舍本逐末之意,而且不好控制。
  InteractiveChange事件比Refresh发生的频率要多很多,所以用这个应该会好很多。另外,Mousemove这个事件也是几乎所有控件都有的,可以考虑找一个面积大的控件来触发,例如背景图。或许这也是一个办法。
2011-07-10 01:12
快速回复:翻點舊帖,文本框的Refresh問題
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018831 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved