Listview-Elemente verschieben

25/05/2011 - 08:45 von Ahmed Martens | Report spam
Hallo Leute,

ich möchte in einem Programm die Möglichkeit schaffen, dass mehrere
Listviewelemente (auch nicht zusammenhàngende) verschoben werden können.

Mit nur einem Element habe ich es hinbekommen.
Wie muss ich aber den Code àndern, dass ich das auch für mehrere machen
kann?

Kann mir einer vielleicht helfen? Ich bekomme das einfach nicht hin.

<Code-Fragment>

80 Case "btnFirst"
90 If lvwSearchResult.ListItems.Count = 0 Then Exit Sub

100 With lvwSearchResult
110 .Sorted = False
120 Index = .SelectedItem.Index
130 If Index > 1 Then

140 .ListItems.Add 1
150 .ListItems(1).Text = .SelectedItem.Text
160 .ListItems(1).SmallIcon = .SelectedItem.SmallIcon

170 For i = 1 To .ColumnHeaders.Count - 1
180 .ListItems(1).SubItems(i) = .SelectedItem.SubItems(i)
190 Next

200 .ListItems.Remove (Index + 1)
210 .ListItems(1).Selected = True
220 .SelectedItem.EnsureVisible

230 End If


240 End With

250 Case "btnLast"

260 If lvwSearchResult.ListItems.Count = 0 Then Exit Sub

270 With lvwSearchResult
280 .Sorted = False
290 Index = .SelectedItem.Index
300 If Index < .ListItems.Count Then

310 .ListItems.Add .ListItems.Count + 1
320 .ListItems(.ListItems.Count).Text = .SelectedItem.Text
330 .ListItems(.ListItems.Count).SmallIcon = .SelectedItem.SmallIcon

340 For i = 1 To .ColumnHeaders.Count - 1
350 .ListItems(.ListItems.Count).SubItems(i) = .SelectedItem.SubItems(i)
360 Next

370 .ListItems.Remove (Index)

380 .ListItems(.ListItems.Count).Selected = True
390 .SelectedItem.EnsureVisible


400 End If

410 End With



420 Case "btnUp"

430 If lvwSearchResult.ListItems.Count = 0 Then Exit Sub

440 With lvwSearchResult
450 .Sorted = False
460 Index = .SelectedItem.Index
470 NewIndex = Index - 1
480 If Index > 1 Then

490 .ListItems.Add NewIndex
500 .ListItems(NewIndex).Text = .SelectedItem.Text
510 .ListItems(NewIndex).SmallIcon = .SelectedItem.SmallIcon

520 For i = 1 To .ColumnHeaders.Count - 1
530 .ListItems(NewIndex).SubItems(i) = .SelectedItem.SubItems(i)
540 Next

550 .ListItems.Remove (Index + 1)

560 .ListItems(NewIndex).Selected = True
570 .SelectedItem.EnsureVisible


580 End If

590 End With


</Code-Fragment>

Gruß Ahmed
Antworten bitte nur in der Newsgroup.
 

Lesen sie die antworten

#1 Ahmed Martens
31/05/2011 - 13:38 | Warnen spam
Für alle die das gleiche Problem haben, hier nun die endgültige Fassung.

Alle Listview-Items werden gleichermaßen verschoben. Daher wird beim
Verschieben an den Anfang/Ende erst einmal die Anzahl der zu
verschiebenden Zeilen ermittelt und entsprechende auf alle markierten
Listitems übertragen.

Die zu übertragenden Werte könnte man noch verallgemeinern, aber das
Prinzip sollte klar sein.

In einem Modul:

<Code>

Public Sub ListViewMoveToTop(lvw As MSComctlLib.ListView)
Dim q As Long
Dim iMove As Long
Dim NewIndex As Long

10 If lvw.ListItems.Count = 0 Then Exit Sub

20 With lvw
30 .Sorted = False

40 For q = 1 To .ListItems.Count
50 If .ListItems(q).Selected Then
60 Index = q
70 iMove = Index - 1
80 Exit For
90 End If
100 Next

110 For q = 1 To .ListItems.Count
120 If .ListItems(q).Selected Then
130 If q > 1 Then
140 NewIndex = q - iMove
150 .ListItems.Add NewIndex
160 .ListItems(NewIndex).Text = .ListItems(q + 1).Text
170 .ListItems(NewIndex).SmallIcon = .ListItems(q + 1).SmallIcon

180 For i = 1 To .ColumnHeaders.Count - 1
190 .ListItems(NewIndex).SubItems(i) = .ListItems(q + 1).SubItems(i)
200 Next

210 .ListItems.Remove (q + 1)
220 .ListItems(NewIndex).Selected = True
230 .ListItems(NewIndex).EnsureVisible

240 End If
250 End If
260 Next

270 End With

End Sub


Public Sub ListViewMovetoBottom(lvw As MSComctlLib.ListView)
Dim q As Long
Dim iMove As Long
Dim NewIndex As Long

10 If lvw.ListItems.Count = 0 Then Exit Sub

20 With lvw
30 .Sorted = False
40 For q = .ListItems.Count To 1 Step -1
50 If .ListItems(q).Selected Then
60 Index = q
70 iMove = (.ListItems.Count - q)
80 Exit For
90 End If
100 Next

110 For q = .ListItems.Count To 1 Step -1
120 If .ListItems(q).Selected Then
130 If q < .ListItems.Count Then
140 NewIndex = (q + iMove) + 1
150 .ListItems.Add NewIndex

160 .ListItems(NewIndex).Text = .ListItems(q).Text
170 .ListItems(NewIndex).SmallIcon = .ListItems(q).SmallIcon

180 For i = 1 To .ColumnHeaders.Count - 1
190 .ListItems(NewIndex).SubItems(i) = .ListItems(q).SubItems(i)
200 Next

210 .ListItems.Remove (q)

220 .ListItems(NewIndex - 1).Selected = True
230 .ListItems(NewIndex - 1).EnsureVisible


240 End If
250 End If
260 Next
270 End With


End Sub


Public Sub ListViewMoveSelUp(lvw As MSComctlLib.ListView)
Dim q As Long

10 If lvw.ListItems.Count = 0 Then Exit Sub

20 With lvw
30 .Sorted = False

40 If .ListItems(1).Selected Then Exit Sub

50 For q = 1 To .ListItems.Count
60 If .ListItems(q).Selected = True Then
70 Index = q
80 NewIndex = Index - 1
90 If Index > 1 Then

100 .ListItems.Add NewIndex
110 .ListItems(NewIndex).Text = .ListItems(q + 1).Text
120 .ListItems(NewIndex).SmallIcon = .ListItems(q + 1).SmallIcon

130 For i = 1 To .ColumnHeaders.Count - 1
140 .ListItems(NewIndex).SubItems(i) = .ListItems(q + 1).SubItems(i)
150 Next

160 .ListItems.Remove (q + 1)

170 .ListItems(NewIndex).Selected = True
180 .SelectedItem.EnsureVisible


190 End If
200 End If

210 Next
220 End With

End Sub

Public Sub ListViewMoveSelDown(lvw As MSComctlLib.ListView)
Dim q As Long

10 If lvw.ListItems.Count = 0 Then Exit Sub

20 With lvw
30 .Sorted = False

40 If .ListItems(.ListItems.Count).Selected Then Exit Sub

50 For q = .ListItems.Count To 1 Step -1
60 If .ListItems(q).Selected = True Then
70 Index = q
80 NewIndex = Index + 2
90 If Index < .ListItems.Count Then

100 .ListItems.Add NewIndex
110 .ListItems(NewIndex).Text = .ListItems(q).Text
120 .ListItems(NewIndex).SmallIcon = .ListItems(q).SmallIcon

130 For i = 1 To .ColumnHeaders.Count - 1
140 .ListItems(NewIndex).SubItems(i) = .ListItems(q).SubItems(i)
150 Next

160 .ListItems.Remove (Index)
170 .ListItems(Index + 1).Selected = True
180 .SelectedItem.EnsureVisible
190 End If
200 End If

210 Next

220 End With


End Sub

</Code>

Gruß Ahmed
Antworten bitte nur in der Newsgroup.
Win7 Prof. 64bit / MS-Office 2010 Prof. 32bit

Ähnliche fragen