- - PR -
リストビューの列ごとソート(実装に失敗)
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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 ※以下例外・終了処理省略 ※問題は●の行で「指定されたキャストは有効ではありません。」エラーが出ます。 |
|
投稿日時: 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-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