【100分】为什么ComboBox.SelectedIndex不是我想象中的结果

m00ners 2008-04-08 03:12:55
【前提】
窗体上放置一个ComboBox和一个Button,并添加以下代码。

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox(Me.ComboBox1.SelectedIndex)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.ComboBox1.Items.AddRange(New Object() {"aa", "bb", "cc", "dd"})
End Sub
End Class

【操作步骤】
1、ComboBox选中一个项目(例如"bb"),单击Button,MsgBox提示"1"。这个没有问题。
2、再次打开ComboBox下拉列表,不要关闭下拉列表,按下BackSpace键清空ComboBox中的内容,仍然不关闭下拉列表,直接点击Button,MsgBox仍然提示"1"。但此时下拉列表中显示的为空白,按理说应该SelectedIndex = -1才对啊???
...全文
642 40 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
knowledge_Is_Life 2008-04-30
  • 打赏
  • 举报
回复
lz要干嘛?
xfjds1987 2008-04-15
  • 打赏
  • 举报
回复
劝你还是搞懂这个事件的驱动方式再说吧。现在的人啊~~~
北京的雾霾天 2008-04-14
  • 打赏
  • 举报
回复
有这么麻烦吗?

实在不行可以使用循环依次取Items里的元素一个个来比,没有什么大不了的,FindString也是这么做的。
jikun6666 2008-04-14
  • 打赏
  • 举报
回复
学习
billow_chentao 2008-04-13
  • 打赏
  • 举报
回复
学习
qjgdftxmu 2008-04-12
  • 打赏
  • 举报
回复
我在28楼有说,那应该是算一个技巧,而不是一个BUG。
算了,你都没有看..............
m00ners 2008-04-12
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 qjgdftxmu 的回复:]
引用 31 楼 m00ners 的回复:
不好意思,做一个更正,刚才可能误导大家的思路了。

现在关键点在这里。
1、ComboBox选中一条记录,不打开下拉列表,用BackSpace清空选定的记录,点击按钮,返回-1。
2、ComboBox选中一条记录, 打开下拉列表,用BackSpace清空选定的记录,点击按钮,返回选定记录的index。

清空前是否打开下拉列表是两种不同表现的原因,而清空后是否关闭下拉列表对结果没有影响。


就第…
[/Quote]

返回值是选定记录的index。
如果返回值是一个不变的数值,那可真的就是Bug了。
qjgdftxmu 2008-04-11
  • 打赏
  • 举报
回复

Public Class Form2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox(Me.ComboBox1.SelectedIndex)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.ComboBox1.Items.AddRange(New Object() {"aa", "bb", "cc", "dd"})
ComboBox1.SelectedIndex = 2
End Sub
End Class


果然,刚才试了一下,设置将ComboBox1的默认值设为2的话,重复操作上述操作返回值就会变成2。

-1应该是指没有选中任何值。而在有下拉列表时清空的话,系统就认为有选中默认值,也许这可以是作为操作ComboBox的一个小技巧,而不是一个BUG。
qjgdftxmu 2008-04-11
  • 打赏
  • 举报
回复

Public Class Form2
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
MsgBox(Me.ComboBox1.SelectedIndex)
End Sub

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
Me.ComboBox1.Items.AddRange(New Object() {"aa", "bb", "cc", "dd"})
ComboBox1.SelectedIndex = 2
End Sub
End Class


果然,刚才试了一下,设置将ComboBox1的默认值设为2的话,重复操作上述操作返回值就会变成2。

-1应该是指没有选中任何值。而在有下拉列表时清空的话,系统就认为有选中默认值,也许这可以是作为操作ComboBox的一个小技巧,而不是一个BUG。
qjgdftxmu 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 m00ners 的回复:]
引用 16 楼 hbxtlhx 的回复:
我也不认为这是个Bug,我觉得这是合理的,
因为SelectedIndex本身为选中的Item的索引,因为没有改变选中的Item,所以这个值不应变。
只是修改了ComboBox的Text,但Text并不与SelectedItem等同,这两个是有不同的意义。

如果要取其文本所表示的元素索引,可以使用如下的方法:

ComboBox.FindString 方法 (String)

ComboBox.FindStringExact 方法


我也感觉不能算是…
[/Quote]

一开始我也是这样想的,但事实不是这样,只要你是在有下拉列表的情况下清空ComboBox的话(不管之前选择是哪一个项),返回值就会是一,即使你再将下拉列表收回去,结果还是1!
如果不是BUG的话,那可能是ComboBox将第一个设为了默认值。
boblaw 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hbxtlhx 的回复:]
我也不认为这是个Bug,我觉得这是合理的,
因为SelectedIndex本身为选中的Item的索引,因为没有改变选中的Item,所以这个值不应变。
只是修改了ComboBox的Text,但Text并不与SelectedItem等同,这两个是有不同的意义。

如果要取其文本所表示的元素索引,可以使用如下的方法:

ComboBox.FindString 方法 (String)

ComboBox.FindStringExact 方法
[/Quote]
我测了一下,把当DropDownStyle设为Simple的时候,ComboBox的表现与LZ所说的状况是不一致的。所以认为可能为bug
北京的雾霾天 2008-04-11
  • 打赏
  • 举报
回复
你可以使用FindString的第二个重载函数
m00ners 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 xiaoxuanZhu 的回复:]
我觉得这个问题要open combobox的源代码看看了。
在combobox失去焦点(lostfocus)的时候一定做了处理,才会有你所说的效果。
[/Quote]

现在看来是这样子。不清楚是什么时候做的处理。总之index在下拉列表关闭后发生变化了。
m00ners 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 m00ners 的回复:]
引用 16 楼 hbxtlhx 的回复:
我也不认为这是个Bug,我觉得这是合理的,
因为SelectedIndex本身为选中的Item的索引,因为没有改变选中的Item,所以这个值不应变。
只是修改了ComboBox的Text,但Text并不与SelectedItem等同,这两个是有不同的意义。

如果要取其文本所表示的元素索引,可以使用如下的方法:

ComboBox.FindString 方法 (String)

ComboBox.FindStringExact 方法


我也感觉不能算是…
[/Quote]

不过FindStringExact只能返回第一个匹配的项目,如果有多个项目的项目存在。
FindStringExact就不是我想要的结果了。
所以还是应该对SelectedIndex或者SelectedValue进行操作。
晓轩 2008-04-11
  • 打赏
  • 举报
回复
如果能有个函数可以根据Text找到Value就更好了,哈哈。


你既然能找到text当然可以根据text项取值了~~~
m00ners 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hbxtlhx 的回复:]
我也不认为这是个Bug,我觉得这是合理的,
因为SelectedIndex本身为选中的Item的索引,因为没有改变选中的Item,所以这个值不应变。
只是修改了ComboBox的Text,但Text并不与SelectedItem等同,这两个是有不同的意义。

如果要取其文本所表示的元素索引,可以使用如下的方法:

ComboBox.FindString 方法 (String)

ComboBox.FindStringExact 方法
[/Quote]

我也感觉不能算是一个Bug,因为不同人的理解是不一样的。

现在的状态是清空ComboBox.Text后,
只要下拉列表不关闭,索引就不发生变化,
但下拉列表关闭,索引就变成-1了。

FindStringExact很好用,可以根据Text找到Index。
如果能有个函数可以根据Text找到Value就更好了,哈哈。
rangeon 2008-04-11
  • 打赏
  • 举报
回复
学习了
晓轩 2008-04-11
  • 打赏
  • 举报
回复
我觉得这个问题要open combobox的源代码看看了。
在combobox失去焦点(lostfocus)的时候一定做了处理,才会有你所说的效果。
晓轩 2008-04-11
  • 打赏
  • 举报
回复
我也测试下看看、、、
m00ners 2008-04-11
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 xiaoxuanZhu 的回复:]
情况1你在textchange里写代码了吗?
还是用的原来的代码产生的1,2这样的效果?
[/Quote]

我指的是以前的代码。TextChanged没有做处理。
如果在TextChanged添加处理,能解决这个问题。
加载更多回复(20)

16,722

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧