linqっての使ってみた
一覧表でカラムをクリックするとソートする機能を作るのに、めんど臭くなって・・
調べているとlinqというSQLで配列を扱う機能があるじゃないですか。
飛びついて組み込んでみると・・・
Dim a = From c As UserTableCls In UserTable Order By c.userid Select c
UserTable.Clear()
UserTable.AddRange(a)
うや?空っぽになったw
どうしてダーと、デバッグモードで動かしてみると。
UserTable.Clear()
どうやらこの行で消えてるようです。
aの変数にカーソルを当てると、メモリー上のテーブル・・・
あーーaという変数には実体はなくて、ポインターがあるだけだから、もとの変数を消してしまうと消えてしまうんだw
Dim a = From c As UserTableCls In UserTable Order By c.userid Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
一度、bというテーブルに実体を移してから、もとに戻す方法に・・・
すると、別のところでエラーが・・・w
仮想モードlistviewのデータテーブルになってるので、listviewから消えた瞬間にアクセスされてしまい、テーブルに無いインデックスを指定しないで!みたいなことをいわれてしまいました。
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.userid Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.Count
いじる前に仮想リストビューに0を設定してデータが無い状態にしてしまって、作業後に復帰させる方法にしてみました。
無事できたーということで、同じコードをカラムのある分だけ作成
Select Case e.Column
Case 0 'ID
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.userid Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.CountCase 1 'dispname
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.DisplayName Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.CountCase 2 'charaname
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.CharaName Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.CountCase 3 'charaname
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.LastComment Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.CountCase 4 'charaname
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.LastAccess Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.CountCase 5 'charaname
UserList.VirtualListSize = 0
Dim a = From c As UserTableCls In UserTable Order By c.CommentCount Select c
Dim b As New List(Of UserTableCls)
b.AddRange(a)
UserTable.Clear()
UserTable.AddRange(b)
UserList.VirtualListSize = UserTable.Count
End Select
単なる作業でしたw
linqっていうの結構使えそうです。
チョロッと検索したいときとか、for文+ifでやるより、where文で書いちゃうほうが見やすいしね。