注册 登录
编程论坛 VFP论坛

被 .combo.displayvalue 搞死了,一天都排查不到问题所在

琅拿度 发布于 2022-11-06 03:35, 1598 次点击
电脑xp系统,下拉菜单是有“2022111”这个项的,第一段是原代码,我发现下拉菜单不能定位到正确的项后,做了以下两段实验进行比较,按我理解他们应该是完全不一样,我已经不知道怎么排查了,超出我的认知了

第一段:(aaa是个变量,根据需要改变)
aaa=2022111
bbb=Allt(Str(aaa))
Thisform.
Thisform.
If Thisform.
    结果=错误
Else
    结果=正确
Endi
&& 最终得到结果“错误”  (下拉菜单就没办法得到正确的项)


第二段:
Thisform.
Thisform.
If Thisform.
    结果=错误
Else
    结果=正确   &&
Endi
&& 最终得到结果“正确” (下拉菜单成功定位2022111)




我是看不懂为何有差别? 已经排查不到原因了,投降了,还有什么办法绕过combo的displavalue属性吗?
11 回复
#2
吹水佬2022-11-06 04:50
这个属性最好不要用来“写”,只用来“读”
#3
琅拿度2022-11-06 11:13
以下是引用吹水佬在2022-11-6 04:50:06的发言:

这个属性最好不要用来“写”,只用来“读”


关键是以前其它地方用好久也没有这个问题啊,而且我真的不知道上面两段代码从意义上讲有任何区别,真的搞死了

另外:我只知道某一项是某个值,还有什么办法下拉到这个值呢?

[此贴子已经被作者于2022-11-6 11:15编辑过]

#4
csyx2022-11-06 11:31
以下是引用琅拿度在2022-11-6 11:13:17的发言:

另外:我只知道某一项是某个值,还有什么办法下拉到这个值呢?


这好办,逐项把它找出来

oo = Thisform.
For ii = 1 to oo.ListCount
    If oo.List[ii] = '2022111'
        oo.ListIndex = ii
        Exit
    EndIf
EndFor


[此贴子已经被作者于2022-11-6 11:37编辑过]

#5
sam_jiang2022-11-06 12:00
2段代码效果应该是一样的啊。
#6
琅拿度2022-11-06 12:08
以下是引用csyx在2022-11-6 11:31:49的发言:



这好办,逐项把它找出来

oo = Thisform.
For ii = 1 to oo.ListCount
    If oo.List = '2022111'
        oo.ListIndex = ii
        Exit
    EndIf
EndFor

If oo.List = '2022111' 应该是If oo.List(ii) = '2022111' 吧

我刚刚也想逐一显示displayvalue的方式排查,但缺点是combo的显示要变,你这个方法好,不用改变displayvalue

#7
琅拿度2022-11-06 12:09
以下是引用sam_jiang在2022-11-6 12:00:31的发言:

2段代码效果应该是一样的啊。


是的,知识理解上完全一样,但现实就是出问题了,还是用前面楼上的方法解决更稳妥,已经遇到过好几次这种莫名其妙的问题了,怀疑人生
#8
cssnet2022-11-06 13:16
以下是引用琅拿度在2022-11-6 12:09:56的发言:
怀疑人生


DisplayValue 属性
===============
指定 ListBox 或 ComboBox 控件中选定项的第一列的内容。设计和运行时可用。

当某个组合框或列表框多于一列,且控件的 BoundColumn 属性设置为大于 1 的值时,使用 DisplayValue 属性。
 
[Form.]Control.DisplayValue[ = Expr]

属性值
Expr
指定字符串或数值。下表列出了 Expr 的值。 Expr 说明
字符串
 指定选定项的第一列的值。

对于组合框,当 DisplayValue 属性是字符串时,DisplayValue 属性指定了组合框的文本框部分中显示的文本。但是,ComboBox 对象的 InputMask 和 MaxLength 属性会影响它的显示。
 
数值
 指定选定项的索引。

说明
应用于:ComboBox 控件 | ListBox 控件

当组合框或列表框中仅有一列时,如果控件的 DisplayValue 属性和 Value 属性都包含字符串,则二者的值通常都相同。但是有一种例外情况:两个属性的内容都是字符串,然后在组合框中输入一个值,但该值不存在于列表中。在此情况下,Value 属性是空字符串(""),而 DisplayValue 属性是所输入的值。
===============

VFP帮助文件详细介绍了DisplayValue属性值的使用方法。
唉,是时候由我老人家给楼主谈谈人生啦——特别是一眼看到楼主“怀疑人生”,不由勾起了我老人家悲天悯人的慈祥而温柔的心绪。
这故事告诉我们:

切莫轻易怀疑人生。人生当中,无论搞任何事情,一定要细心、细心再细心!

DisplayValue = 字符串,此时指定选定项的第一列的值。
DisplayValue = 数值,此时指定选定项的索引。

——楼上的,安德丝店?

若要指定数值型DisplayValue,应该是1、2、3、4……而非2022111!

——楼上的,安德丝店?
#9
csyx2022-11-06 13:38
以下是引用cssnet在2022-11-6 13:16:24的发言:
若要指定数值型DisplayValue,应该是1、2、3、4……而非2022111!

——楼上的,安德丝店?

人家是 '2022111' 而非 2022111,安德丝旦
#10
琅拿度2022-11-06 15:12
以下是引用cssnet在2022-11-6 13:16:24的发言:



DisplayValue 属性
===============
指定 ListBox 或 ComboBox 控件中选定项的第一列的内容。设计和运行时可用。

当某个组合框或列表框多于一列,且控件的 BoundColumn 属性设置为大于 1 的值时,使用 DisplayValue 属性。
 
[Form.]Control.DisplayValue[ = Expr]

属性值
Expr
指定字符串或数值。下表列出了 Expr 的值。 Expr 说明
字符串
 指定选定项的第一列的值。

对于组合框,当 DisplayValue 属性是字符串时,DisplayValue 属性指定了组合框的文本框部分中显示的文本。但是,ComboBox 对象的 InputMask 和 MaxLength 属性会影响它的显示。
 
数值
 指定选定项的索引。

说明
应用于:ComboBox 控件 | ListBox 控件

当组合框或列表框中仅有一列时,如果控件的 DisplayValue 属性和 Value 属性都包含字符串,则二者的值通常都相同。但是有一种例外情况:两个属性的内容都是字符串,然后在组合框中输入一个值,但该值不存在于列表中。在此情况下,Value 属性是空字符串(""),而 DisplayValue 属性是所输入的值。
===============

VFP帮助文件详细介绍了DisplayValue属性值的使用方法。
唉,是时候由我老人家给楼主谈谈人生啦——特别是一眼看到楼主“怀疑人生”,不由勾起了我老人家悲天悯人的慈祥而温柔的心绪。
这故事告诉我们:

切莫轻易怀疑人生。人生当中,无论搞任何事情,一定要细心、细心再细心!

DisplayValue = 字符串,此时指定选定项的第一列的值。
DisplayValue = 数值,此时指定选定项的索引。

——楼上的,安德丝店?

若要指定数值型DisplayValue,应该是1、2、3、4……而非2022111!

——楼上的,安德丝店?


但是有一种例外情况:两个属性的内容都是字符串,然后在组合框中输入一个值,但该值不存在于列表中。在此情况下,Value 属性是空字符串(""),而 DisplayValue 属性是所输入的值。

这句话说明“不存在”时,DisplayValue 属性才是数值。但问题是我输入后,这个项不但存在,而且我要的是indexlist的值,所以你能解释一下吗? 并且我两段代码写的很清楚了,都是字符型的,但得到了不同的结果,你认为是什么原因呢?
#11
liuxingang282022-11-07 11:12
要想我们帮助你不“怀疑人生”,要把遇到的问题解释清楚,最好是把测试环境“打包”附上,而不是只给出问题,让大家对问题的运行环境去猜谜语。
我简单试了一下,在我构建的测试环境下,没有任何问题。不可能“‘2022111’”能正确执行,而“”就执行错误了。
问题很有可能出在其他地方,如:、变量 aaa和bbb的作用域、……

以下是我的一些应用心得,希望对你有所帮助。
对于组合框控件来说,该控件的如下几个属性十分重要:
1. Style 属性
该属性决定了控件的行为方式是“下拉组合框”还是“下拉列表框”,前者允许键盘输入,而后者仅能从列表框选择。
2. Value 的初始值
当Value的初始值为字符型时,在后续代码中引用Value时返回的是控件的“List[index]”;而当Value的初始值为数值型时,问题就复杂了,参见下文“BoundTo”属性。
3. BoundTo属性
当BoundTo=.f.时,若Value的初始值为数值型,则后续的Value返回的是控件的ListIndex,若Value的初始值为字符型,则后续Value返回的是List[index]值。
当BoundTo=.t.时,则后续的Value返回的是控件的List[index]。一般来说,当列表项目是数值时,一般应设定BoundTo=.t.。
4. Value 与 DisplayValue
区别主要有三点:
第一:DisplayValue 永远是字符型,而 Value 的数据类型由其初始值决定。
第二:DisplayValue只能是“读”,而Value可“读”也可“写”,也就是说,当组合框指定了ControlSource时,通过修改Value可以影响其绑定的控件来源。
第三:DisplayValue主要应用于Style = 0(下拉组合框)的情况。它可用于将组合框显示为列表中不存在的项目。比如:我们可以在组合框中手工输入一个新项目,在控件的LostFocus中将其添加到列表。

在指定当前列表项目时,最好使用 ListIndex 或 Value。在指定初始列表项目时,最好在控件的 Init 事件中,而不是设计方式下通过直接指定Value或DisplayValue。

[此贴子已经被作者于2022-11-7 11:20编辑过]

#12
schtg2022-11-07 15:38
回复 11楼 liuxingang28
谢谢!
1