- PR -

リストビューの列ごとソート(実装に失敗)

1
投稿者投稿内容
どらごん
会議室デビュー日: 2003/02/05
投稿数: 8
投稿日時: 2003-02-28 13:26
環境:VB.NET WinForm ListViewにて

お世話になっております。どらごんと申します。
Function Compare(ByVal x As Object, ByVal y As Object) As Integer

実は、リストビューにおいて列毎にソートする方法を模索しておりまして、
いろいろ調べた結果、C#にて実現しているというソースを探し当てました。
(見つかる情報がC#ばかりで・・・)
拙い知識で、ワタシなりにVB.NETに置き換えてみたのですが、エラーが・・・(T_T)

お忙しいところ誠に申し訳ないのですが、ご指導頂けないでしょうか_(_^_)_
(参考になる情報を提示して頂けるだけでも結構です)

1.ListLineSortクラスを新規で作成
Interface IComparer
Function Compare(ByVal x As Object, ByVal y As Object) As Integer
End Interface

Public Class ListLineSort
Implements IComparer

Private p_col As Integer 'Itemインデックス
Private p_sortFlag As Boolean 'ソートフラグ

Public Sub New(ByVal iCol As Integer, ByVal iFlag As Boolean)
p_col = iCol
p_sortFlag = iFlag
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim intReturn As Integer '戻り値用
Dim lviItem1 As ListViewItem = CType(x, ListViewItem) 'リストビューアイテムワーク用
Dim lviItem2 As ListViewItem = CType(y, ListViewItem) 'リストビューアイテムワーク用

'比較処理
intReturn = lviItem1.SubItems(p_col).Text.CompareTo(lviItem2.SubItems(p_col).Text)

'p_sortFlagがtrueの時は昇順に並んでいる
If p_sortFlag = True Then
Return intReturn
Else
Return intReturn * -1
End If
End Function

End Class

2.1.クラスを参照して、ソートを実装
Private Sub ListViewEx_ColumnClick(ByVal sender As Object, ByVal e As System.Windows.Forms.ColumnClickEventArgs) Handles MyBase.ColumnClick
'ListViewソート用IComparer
Dim cusListLineSort As ListLineSort

Try
'クリックしたカラムヘッダを基に取得
cusListLineSort = New ListLineSort(e.Column, blnSorting)

'ソートプロパティにソート方法設定
● MyBase.ListViewItemSorter = cusListLineSort
MyBase.ListViewItemSorter = Nothing

'ソート後、並び順反転保持
If blnSorting = True Then
blnSorting = False
Else
blnSorting = True
End If
※以下例外・終了処理省略

※問題は●の行で「指定されたキャストは有効ではありません。」エラーが出ます。
Tog
ベテラン
会議室デビュー日: 2002/06/09
投稿数: 76
投稿日時: 2003-02-28 18:59
Interface IComparer
Function Compare(ByVal x As Object, ByVal y As Object) As Integer
End Interface

IComparerインターフェースを自分で作成しているのでしょうか?
名前空間: System.CollectionsのIComparerを使う必要があります。
キャストの失敗はここではないでしょうか。
どらごん
会議室デビュー日: 2003/02/05
投稿数: 8
投稿日時: 2003-03-03 11:33
Togさん、おっしゃっている通りInterface句を削除することで思うように並べ替え出来ました。

思えば、「IComparer インターフェイスを実装する」ということを
「IComparerと同じインターフェイスであれば何でもよい」と勝手に解釈していた自分が
まだまだ・・・という感じです。これからも精進したいと思います。

余談ですが、昨日ちゃんとソートが動作してる夢を見たのです。
夢の中でガッツポーズしておりました(笑)が、現実になってホッとしました_(_^_)_
ありがとうございました!!


Public Class ListLineSort
Implements System.Collections.IComparer

Private p_col As Integer 'Itemインデックス
Private p_sortFlag As Boolean 'ソートフラグ

Public Sub New(ByVal iCol As Integer, ByVal iFlag As Boolean)
p_col = iCol
p_sortFlag = iFlag
End Sub

Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
Dim intReturn As Integer '戻り値用
Dim lviItem1 As ListViewItem = CType(x, ListViewItem) 'リストビューアイテムワーク用
Dim lviItem2 As ListViewItem = CType(y, ListViewItem) 'リストビューアイテムワーク用

'比較処理
intReturn = lviItem1.SubItems(p_col).Text.CompareTo(lviItem2.SubItems(p_col).Text)

'p_sortFlagがtrueの時は昇順に並んでいる
If p_sortFlag = True Then
Return intReturn
Else
Return intReturn * -1
End If
End Function

End Class
1

スキルアップ/キャリアアップ(JOB@IT)