您的位置:首页 > 编程语言 > VB

[VB.NET]一个关于VB2005中 listbox的奇怪的问题

2008-12-27 14:02 691 查看



<script type="text/javascript"><!--
google_ad_client = "pub-8333940862668978";
/* 728x90, 创建于 08-11-30 */
google_ad_slot = "4485230109";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>

一个关于VB2005中 listbox的奇怪的问题
我使用多选的listbox来取得选项的值,不知怎么搞得,总是只能选到listbox中最后一项的值。
我是这样给listbox添加选项的:

Do Until Rs.EOF
TempPeople.Id = Rs.Fields( "id ").Value
TempPeople.Name = Rs.Fields( "姓名 ").Value
TempPeople.Nickname = Rs.Fields( "昵称 ").Value
TempPeople.Sex = Rs.Fields( "性别 ").Value
ListBox1.Items.Add(TempPeople)
Rs.MoveNext()
Loop
这个过程现实的结果是没有问题的,listbox现实的项是正确的。
但是,之后再获取listbox.items或者listbox.selecteditems中的项时,得到的确实是相同类型的对象,但是只能获得列表中的最后一个对象!

也就是说,我向listbox添加了张三,李四,王二三个项,能显示出来。多选后,返回值总是最后一个王二。而且是选了几个项就获得几个王二。不论我选择的是张三和李四,或者是张三和王二,或者是三个都选,selecteditems总是返回2个或3个王二,items里面则全部是王二!这到底是怎么回事?怎么办?
__________________________________________________________________________
跟蹤調試下,看獲取的值是否一樣
__________________________________________________________________________
试过了,但是监视变量时无法察看items这类集合内的对象,只能看到count等属性。
__________________________________________________________________________
看看你设置的ListBox的SelectionMode 正确吗?

我用下面这段代码试了试,可以正确显示选中项啊。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
For i As Integer = 0 To ListBox1.SelectedItems.Count - 1
MsgBox(ListBox1.SelectedItems(i))
Next
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ListBox1.SelectionMode = SelectionMode.MultiSimple
For i As Integer = 0 To 10
ListBox1.Items.Add(String.Format( "Item-{0} ", i))
Next
End Sub
__________________________________________________________________________
或许跟这儿有关

Do Until Rs.EOF
TempPeople=New People

TempPeople.Id = Rs.Fields( "id ").Value
TempPeople.Name = Rs.Fields( "姓名 ").Value
TempPeople.Nickname = Rs.Fields( "昵称 ").Value
TempPeople.Sex = Rs.Fields( "性别 ").Value
ListBox1.Items.Add(TempPeople)
Rs.MoveNext()
Loop
__________________________________________________________________________
是multisimple,确认无误。否则也不能选中多项。

我最奇怪的就是,显示出来的项是三个不同的项,获取的items却是相同的项。

为了确认刚才的问题,我又在原来的代码下面加了一行做测试,

Do Until Rs.EOF
TempPeople.Id = Rs.Fields( "id ").Value
TempPeople.Name = Rs.Fields( "姓名 ").Value
TempPeople.Nickname = Rs.Fields( "昵称 ").Value
TempPeople.Sex = Rs.Fields( "性别 ").Value
ListBox1.Items.Add(TempPeople)
Rs.MoveNext()
Loop
form2.text=listbox1.items(0).tostring

运行后,listbox中显示的依次是张三、李四、王二,而form2.text竟然是王二!
我怀疑是items.add()的问题!
__________________________________________________________________________
监视表明,temppeople是没问题的,每一次循环时都改变了值。
__________________________________________________________________________
Public Class Form1

Class People
Public Id As Integer
Public Name As String
''省略
End Class

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
For i As Integer = 0 To ListBox1.SelectedItems.Count - 1
MsgBox(CType(ListBox1.SelectedItems(i), People).Name)
Next
End Sub

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
ListBox1.SelectionMode = SelectionMode.MultiSimple

Dim TempPeople As New People ''注意这儿,方法一
For i As Integer = 0 To 10
''Dim TempPeople As New People ''注意这儿,方法二
TempPeople.Id = i
TempPeople.Name = String.Format( "Item-{0} ", i)
ListBox1.Items.Add(TempPeople)
Next
End Sub
End Class

看看上面两个注意的地方,两个方法执行后的结果就不一样了。
第一种类似于你的方法。你看是不是?
__________________________________________________________________________
进一步实验表明,在循环体内时,items(0),items(1),items(2)还是不同的值,循环体一结束,items(0),items(1)都变成了items(2)一样的值。神了!
__________________________________________________________________________
Do Until Rs.EOF
TempPeople=New People ''可以判定就这儿的问题了

TempPeople.Id = Rs.Fields( "id ").Value
TempPeople.Name = Rs.Fields( "姓名 ").Value
TempPeople.Nickname = Rs.Fields( "昵称 ").Value
TempPeople.Sex = Rs.Fields( "性别 ").Value
ListBox1.Items.Add(TempPeople)
Rs.MoveNext()
Loop
__________________________________________________________________________
wzuomin 你是神!我太崇拜你了!果然是这个问题!

我不知道这个声明摆在循环体外和体内有什么区别,我觉得有一个重赋值的过程就够了嘛。看来我对面向对象的理解还是非常肤浅的。

谢谢wzuomin!
__________________________________________________________________________
呵呵,问题解决就好!
其实从你的 进一步实验表明 中就能完全判定错误之处了!
__________________________________________________________________________
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息