ソートする前の状態では、上下ボタンで選択したアイテムを移動させる事が
出来ていましたが、ソート後では上下ボタンでアイテムが移動出来なくなりました。
ソート後でも、選択したアイテムを移動させたいのですが、原因が分かりません。
どなたか教えて頂きたいと思います。宜しくお願い致します。
※FromにListViewとButtonを2つ配置しています。
VB
1Imports System.Text 2Imports Microsoft.VisualBasic.FileIO 3Public Class Form1 4 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 5 With ListView1 6 .GridLines = True 7 .View = View.Details 8 .FullRowSelect = True 9 .MultiSelect = False 10 .Columns.Add(" I D", 70, HorizontalAlignment.Center) 11 .Columns.Add("会 社 名", 200, HorizontalAlignment.Center) 12 .Columns.Add("名 前", 130, HorizontalAlignment.Center) 13 End With 14 Using parser As New TextFieldParser("C:\Users\ユーザー名\テスト.csv", Encoding.UTF8) 15 parser.TextFieldType = FieldType.Delimited 16 parser.HasFieldsEnclosedInQuotes = True 17 parser.SetDelimiters(",") 18 ListView1.Items.Clear() 19 While Not parser.EndOfData 20 Dim fields As String() = parser.ReadFields() 21 ListView1.Items.Add(New ListViewItem(fields)) 22 End While 23 End Using 24 End Sub 25 26 ' 「↑」ボタン 27 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 28 'アイテムが選択されていない場合抜ける 29 If ListView1.SelectedItems.Count = 0 Then 30 Return 31 End If 32 '先頭のアイテムが選択されている場合抜ける 33 If ListView1.SelectedItems(0).Index = 0 Then 34 Return 35 End If 36 '挿入先のインデックス 37 Dim insertPosition As Integer = ListView1.SelectedItems(0).Index - 1 38 '選択されたアイテム 39 Dim itm As ListViewItem = ListView1.SelectedItems(0) 40 '選択されたアイテムを削除する 41 ListView1.Items.Remove(itm) 42 'アイテムを挿入する 43 ListView1.Items.Insert(insertPosition, itm) 44 ListView1.Select() 45 ListView1.EnsureVisible(insertPosition) 46 End Sub 47 48 ' 「↓」ボタン 49 Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click 50 'アイテムが選択されていない場合抜ける 51 If ListView1.SelectedItems.Count = 0 Then 52 Return 53 End If 54 '最後のアイテムが選択されている場合抜ける 55 If ListView1.SelectedItems(0).Index = ListView1.Items.Count - 1 Then 56 Return 57 End If 58 '挿入先のインデックス 59 Dim insertPosition As Integer = ListView1.SelectedItems(0).Index + 1 60 '選択されたアイテム 61 Dim itm As ListViewItem = ListView1.SelectedItems(0) 62 '選択されたアイテムを削除する 63 ListView1.Items.Remove(itm) 64 'アイテムを挿入する 65 ListView1.Items.Insert(insertPosition, itm) 66 ListView1.Select() 67 ListView1.EnsureVisible(insertPosition) 68 End Sub 69 70 'フォームのカラムクリックイベント 71 Private Sub ListView1_ColumnClick(ByVal sender As Object, 72 ByVal e As System.Windows.Forms.ColumnClickEventArgs) _ 73 Handles ListView1.ColumnClick 74 Static no(2) As Integer '列のソート状態保持用 75 If no(e.Column) = 0 Then 76 '初回または昇順 77 Me.ListView1.ListViewItemSorter = New ListViewItemComparer(e.Column, 0) 78 no(e.Column) = 1 '次回は降順 79 Else 80 '降順 81 Me.ListView1.ListViewItemSorter = New ListViewItemComparer(e.Column, 1) 82 no(e.Column) = 0 '次回は昇順 83 End If 84 End Sub 85 86 'ListViewItemComparerクラスをフォームコードに追加 87 Class ListViewItemComparer 88 Implements IComparer 89 90 Private col As Integer 91 Private sort As Integer 92 93 Public Sub New() 94 col = 0 95 sort = 0 96 End Sub 97 98 Public Sub New(ByVal column As Integer, ByVal sortflg As Integer) 99 'column : 列番号 100 'sortflg : ソート(0=昇順,1=降順) 101 '-------------------------------- 102 col = column 103 sort = sortflg 104 End Sub 105 106 Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer _ 107 Implements IComparer.Compare 108 If sort = 0 Then 109 '昇順 110 Return [String].Compare(CType(x, ListViewItem).SubItems(col).Text, 111 CType(y, ListViewItem).SubItems(col).Text) 112 Else 113 '降順 114 Return -[String].Compare(CType(x, ListViewItem).SubItems(col).Text, 115 CType(y, ListViewItem).SubItems(col).Text) 116 End If 117 End Function 118 End Class 119End Class
ListView.ListViewItemSorterプロパティの説明に
https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.listview.listviewitemsorter?view=netframework-4.8
Sort または項目がリストに追加されたときに、コントロール内の項目の並べ替えを実行するオブジェクトを指定できます。
とあります。
アイテムを消して挿入した結果ソートされているだけなのではないでしょうか。
遅くなりましたが、回答有難う御座いました。
フォームのカラムクリックイベントの
Me.ListView1.ListViewItemSorter = New ListViewItemComparer(e.Column, 0)の後と、
Me.ListView1.ListViewItemSorter = New ListViewItemComparer(e.Column, 1)の後に
「ListView1.ListViewItemSorter = Nothing」の一行を入れる事で
解決しました。
有難う御座いました。
回答1件
あなたの回答
tips
プレビュー