|
分類:[VB.NET]
まどか様、ご意見ありがとうございます。 なかなかうまく説明できなかったみたいですので小規模なコードでも記載しますね
Private Sub ListView1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles ListView1.KeyDown Select Case e.KeyData Case (Keys.Control Or Keys.Up), (Keys.Control Or Keys.Down) With ListView1.Items If .Count < 2 Then Return ''If .Count = ListView1.SelectedItems.Count Then Return ''If ListView1.SelectedItems.Count = 0 Then Return
Dim index(.Count - 1) As Integer '長くなるので中略 index() には変更後の各アイテムのインデックスを計算して入れる For i As Integer = 0 To .Count - 1 'とりあえず例として全アイテムの序列を反転するようなインデックス index(i) = .Count - i - 1 Next
Dim dic As New Dictionary(Of Object, Integer)(.Count) For i As Integer = 0 To .Count - 1 dic.Add(.Item(i), index(i)) Next ListView1.ListViewItemSorter = New Sorter(dic) ListView1.ListViewItemSorter = Nothing End With End Select End Sub
Private Class Sorter Implements System.Collections.IComparer Private mDictionary As Dictionary(Of Object, Integer)
Friend Sub New(ByRef dic As Dictionary(Of Object, Integer)) mDictionary = dic End Sub
Friend Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements System.Collections.IComparer.Compare With mDictionary Return .Item(x) - .Item(y) End With End Function End Class
で、Remove,Insertでやりますとやたらとリストビューがちらつくのと 項目数が多いと(現状、最大で300行程度なのですが)結構時間がかかっちゃうので、 いろいろ試行錯誤しているところです。 サブアイテムのBackColorとか色変えたりしてるからって言うのもあると思います。 あと、BeginUpdate、EndUpdateは必要に応じて使用しております。
要点をまとめると、任意の序列でListView.Itemsを並べ替える方法 という事になりますかね。。
|