![]() |
#2
风吹过b2015-07-15 22:11
以前的代码都是从来不考虑顺序的,第一次考虑顺序不能变,所以就写出了超长的代码。
慢慢看吧。控件,大体上是按你的控件排列的。 你的代码不愿看,没有缩进,看花眼 不考虑顺序就是 Dim i As Long For i = 0 To List1.ListCount - 1 If List1.Selected(i) Then List2.AddItem List1.List(i) End If Next i For i = List1.ListCount - 1 To 0 Step -1 If List1.Selected(i) Then List1.RemoveItem i End If Next i ![]() Option Explicit Private Enum LE '枚举,位置只有二种 L1 = 0 L2 = 1 End Enum Private Type Ltype N As String '内容 L As LE '所属列表 End Type Dim L() As Ltype '数组 Dim Lconst As Long '数组元素个数 Private Sub Command1_Click(Index As Integer) Dim i As Long Select Case Index Case 0 If List1.SelCount = 0 Then Exit Sub For i = 0 To List1.ListCount - 1 If List1.Selected(i) Then L(FindL(List1.List(i))).L = L2 '把该项目名字查数组,得到索引号,然后设置到列表2 End If Next i Case 1 For i = 0 To Lconst L(i).L = L2 '全列表2 Next i Case 2 If List2.SelCount = 0 Then Exit Sub For i = 0 To List2.ListCount - 1 If List2.Selected(i) Then L(FindL(List2.List(i))).L = L1 End If Next i Case 3 For i = 0 To Lconst L(i).L = L1 Next i End Select Call Lview End Sub Private Sub Form_Load() Lconst = 4 '总5个,从0起就=4 ReDim L(Lconst) L(0).N = "姓名" '5项的名字 L(1).N = "性别" L(2).N = "年龄" L(3).N = "籍贯" L(4).N = "文化程度" Dim i As Long For i = 0 To Lconst L(i).L = L1 '默认全是列表1 Next i Call Lview End Sub Public Sub Lview() '把项目按照设置值排列在二个列表框中,做到按顺序排列,并且不能出现闪烁,也就是不能整体清除,再添加 Dim i As Long Dim j As Long Dim lw1 As Long, lw2 As Long For i = 0 To Lconst If L(i).L = L1 Then '如果属于列表1 j = FindList(L(i).N, List1) '检索是否在列表1 If j = -1 Then '不在 List1.AddItem L(i).N, lw1 '根据应该在的位置,添加进去 j = FindList(L(i).N, List2) '检索是否在列表2 If j > -1 Then List2.RemoveItem j '如果在,则删掉 End If lw1 = lw1 + 1 '计算下一个项目如果属于列表1的话,应该在的位置 Else j = FindList(L(i).N, List2) If j = -1 Then List2.AddItem L(i).N, lw2 j = FindList(L(i).N, List1) If j > -1 Then List1.RemoveItem j End If lw2 = lw2 + 1 End If Next i End Sub Public Function FindList(cs As String, Obj As ListBox) As Long '查询 项目 在指定的列表中的索引值,可能不存在的 Dim i As Long FindList = -1 For i = 0 To Obj.ListCount - 1 If Obj.List(i) = cs Then FindList = i Exit For End If Next i End Function Public Function FindL(cs As String) As Long '查询 项目 在数组中的索引值 Dim i As Long For i = 0 To Lconst If L(i).N = cs Then FindL = i Exit For End If Next i End Function |
只有本站会员才能查看附件,请 登录
只有本站会员才能查看附件,请 登录
使用列表框将一个列表框中的内容移动到另一个列表框中
如何实现向左/右移动多个选择的项?
Private Sub Command1_Click(Index As Integer)
Select Case Index
Case 0
If List1.ListCount = 0 Then
Exit Sub
End If
If List1.ListIndex = -1 Then
List1.SetFocus
List1.Selected(0) = True
End If
DoEvents
List2.AddItem List1.Text
List1.RemoveItem List1.ListIndex
Case 1
If List1.ListCount = 0 Then
Exit Sub
End If
If List1.ListIndex = -1 Then
List1.SetFocus
List1.Selected(0) = True
End If
DoEvents
For i = (List1.ListCount - 1) To 0 Step -1
List2.AddItem List1.List(i)
DoEvents
Next i
List1.Clear
Case 2
If List2.ListCount = 0 Then
Exit Sub
End If
If List2.ListIndex = -1 Then
List2.SetFocus
List2.Selected(0) = True
End If
List1.AddItem List2.Text
List2.RemoveItem List2.ListIndex
Case 3
If List2.ListCount = 0 Then
Exit Sub
End If
If List2.ListIndex = -1 Then
List2.SetFocus
List2.Selected(0) = True
End If
For i = (List2.ListCount - 1) To 0 Step -1
List1.AddItem List2.List(i)
DoEvents
Next i
List2.Clear
End Select
End Sub
Private Sub Form_Load()
List1.AddItem "姓名", 0
List1.AddItem "性别", 1
List1.AddItem "年龄", 2
List1.AddItem "籍贯", 3
List1.AddItem "文化程度", 4
End Sub
[ 本帖最后由 tszhaoweiwen 于 2015-7-15 16:55 编辑 ]