当前位置:编程学习 > C#/ASP.NET >>

求VB.net代码(把一个listbox被选中的记录添加到另一个listbox)

求代码  VB.NET  实现:我要求的是最常规的用按钮来移到,有《 ,< ,>, 》,四个按钮,怎么进行两个listbox间的操作 --------------------编程问答--------------------
     Dim i As Integer
        For i = 0 To Me.ListBox1.Items.Count - 1
            If Me.ListBox1.Items(i).Selected Then
                Me.ListBox2.Items.Add(Me.ListBox1.Items(i))
                Me.ListBox1.Items.RemoveAt(i)
            End If

        Next

这是我自己写的一个方法:把listbox1选中的项添加到listbox2中
出现一个问题:就是我选取最后一项添加到listbox2没问题,但是其他所有项都会报错:
索引超出范围。必须为非负值并小于集合大小。 参数名: index

我的listbox1里面的数据是绑定数据库的,我的绑定也放在Page_Load的   Not IsPostBack 中。
请求解决办法 --------------------编程问答-------------------- 不应该在循环中删除元素。。。

--------------------编程问答-------------------- Dim i As Integer
        For i = 0 To Me.ListBox1.Items.Count - 1
            If Me.ListBox1.Items(i).Selected Then
                Me.ListBox2.Items.Add(Me.ListBox1.Items(i))
            End If
     If Me.ListBox1.Items(i).Selected Then
                Me.ListBox1.Items.Remove(i)
            End If
        Next
--reply by CSDN Study V1.0.0.3 (starts_2000) --------------------编程问答-------------------- Dim i As Integer
  For i = 0 To Me.ListBox1.Items.Count - 1
  If Me.ListBox1.Items(i).Selected Then
  Me.ListBox2.Items.Add(Me.ListBox1.Items(i))
  End If
  If Me.ListBox1.Items(i).Selected Then
  Me.ListBox1.Items.Remove(i)
  End If
  Next
Dim i As Integer
  For i = 0 To Me.ListBox1.Items.Count - 1
  If Me.ListBox1.Items(i).Selected Then
  Me.ListBox2.Items.Add(Me.ListBox1.Items(i))
  End If
  next i
  For i = 0 To Me.ListBox1.Items.Count - 1
  If Me.ListBox1.Items(i).Selected Then
  Me.ListBox1.Items.Remove(i)
  End If
  Next i

--reply by CSDN Study V1.0.0.3 (starts_2000) --------------------编程问答-------------------- 要从后面开始删除 --------------------编程问答-------------------- 循环换成倒序就没事了 --------------------编程问答--------------------
引用 1 楼 lp370480 的回复:
VB.NET code
     Dim i As Integer
        For i = 0 To Me.ListBox1.Items.Count - 1
            If Me.ListBox1.Items(i).Selected Then
                Me.ListBox2.Items.Add(Me.ListBox1.Items(i))
  ……


做数据集绑定,你删除的时候,删除数据集上的值,不是控件上的值~然后刷新显示,就可以了~~

--------------------编程问答--------------------  For i = Me.ListBox1.Items.Count - 1 to 0 step -1

......



--------------------编程问答-------------------- vb2014 兄弟,你的这个我测试了,是不行的,但是你加上
Me.lbxRight.SelectionMode = ListSelectionMode.Multiple  就没问题。其实你的代码跟我他的差不多,你的这句Me.ListBox2.Items.Add(Me.ListBox1.Items(i))
你这样循环添加就是多选一次添加,虽然你每次只添加一项,但你右边添加多少项就有多少项处于被选中状态,虽然你每次点击添加按钮页面被刷新一次,
我个人认为就是右边得到的添加项只是对右边项的一个引用,在内存中就是以i为顺序的引用,等你添加了一项后,内存中就加一项,一只到你程序结束内存才释放,
我这样写就可以,也不用设置右边的LISTBOX为多选
Dim i As Integer
        For i = 0 To Me.lbxLeft.Items.Count - 1
            If Me.lbxLeft.Items(i).Selected Then
                If Not Me.lbxRight.Items.Contains(Me.lbxLeft.SelectedItem) Then '右边LISTBOX已有的项则不允许插入
                    Me.lbxRight.Items.Add(New ListItem(Me.lbxLeft.Items(i).Text, Me.lbxLeft.Items(i).Value))
                End If
            End If
        Next


这个问题其实我也不太理解,我想请大家一起看看这个过程是怎么进行的 --------------------编程问答-------------------- 刚才试过 循环换成倒序 也不行,现在我问题是解决了 但是我想知道问题出在哪里 这样两种不同的添加两种过程是什么样的,往得到解释 
 当被添加的LISTBOX为单选的话,循环用:Me.ListBox2.Items.Add(Me.ListBox1.Items(i))
是不行的,循环用:Me.lbxRight.Items.Add(New ListItem(Me.lbxLeft.Items(i).Text, Me.lbxLeft.Items(i).Value))
是可以的。

但是 当被添加的LISTBOX为多选的话,循环用 Me.ListBox2.Items.Add(Me.ListBox1.Items(i))
也是可以的 --------------------编程问答-------------------- 请问我的问题不够明朗吗? --------------------编程问答-------------------- 中间讨论的啥没看,这个按理说是个很简单的问题。
10楼说没碰到, Me.ListBox1.SelectionMode 只有 SelectionMode.One SelectionMode.None SelectionMode.MultiSimple SelectionMode.MultiExtended 四种没你写的ListSelectionMode.Multiple 

下面代码在你第一次给的代码基础上更改,测试通过,单选多选均通过。
           Dim i As Integer

        '操作的是选择项,则该直接用选择项来处理效率更高
        'For i = 0 To Me.ListBox1.Items.Count - 1
        If Me.ListBox1.SelectedItems Is Nothing Then
            Exit Sub
        End If
        Dim b As ListBox.ObjectCollection

        '循环所有选择项 
        For i = 0 To Me.ListBox1.SelectedItems.Count - 1
            '必定是选择项不需要在判断 
            'If Me.ListBox1.Items(i).Selected Then 

            '直接添加到box2(注意操作项固定为0,原因是每次移除选择项后,循环中Me.ListBox1.SelectedItems.Count的值每次循环都是重新计算的,这里移除一项,就会-1,而i是累加的不能直接用,这里也就相当于循环重新开始的可以固定为0,便于理解的话用倒序就没可以直接使用i,如果要保持原对应位置,改为固定位置插入即可)
            Me.ListBox2.Items.Add(Me.ListBox1.SelectedItems(0))

            '移除操作的选择项对应ListBox1的索引
            Me.ListBox1.Items.RemoveAt(Me.ListBox1.SelectedIndices(0))
            'End If
        Next
--------------------编程问答-------------------- 这问题,LZ不能自己解决吗?
都这样的话,算了,你懂得.
补充:.NET技术 ,  VB.NET
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,