001 002 003 004 005 006 007 008 009 010
011 012 013 014 015 016 017 018 019 020
021 022 023 024 025 026 027 028 029 030
031 032 033 034 035 036 037 038 039 040
041 042 043 044 045 046 047 048 049 050
051 052 053 054 055 056 057 058 059 060
061 062 063 064 065 066 067 068 069 070
071 072 073 074 075 076 077 078 079 080
081 082 083 084 085 086 087 088 089 090
091 092 093 094 095 096 097 098 099 100
101 102 103 104 105 106 107 108 109 110
111 112 113 114 115 116 117 118 119 120
121 122 123 124 125 126 127 128 129 130
131 132 133 134 135 136 137 138 139 140
141 142 143 144 145 146 147 148 149 150
151 152 153 154 155 156 157 158 159 160
161 162 163 164 165 166 167 168 169 170
171 172 173 174 175 176 177 178 179 180
181 182 183 184 185 186 187 188 189 190
191 192 193 194 195 196 197 198 199 200
201 202 203 204 205 206 207 208 209 210
211 212 213 214 215 216 217 218 219 220
221 222 223 224 225 226 227 228 229 230
231 232 233 234 235 236 237 238 239 240
241 242 243 244 245 246 247 248 249 250
251 252 253
|
' 比較方法を指定する列挙型
Public Enum ComparisonMode
ByName = 0
ByBirthDate = 1
ByAge = 2
ByBloodType = 3
End Enum
' 比較を行うクラス
Public Class Comparer
' IComparerインターフェイスをインプリメント
Implements IComparer
' 比較方法
Public ComparisonMode As ComparisonMode
' 昇順か降順か ( System.Windows.Forms.SortOrder列挙型を流用 )
Public SortOrder As SortOrder
' コンストラクタ
Public Sub New()
End Sub
Public Sub New(ByVal comparisonMode As ComparisonMode, ByVal sortOrder As SortOrder)
Me.ComparisonMode = comparisonMode
Me.SortOrder = sortOrder
End Sub
' 比較を行うメソッド
Public Function Compare(ByVal x As Object, ByVal y As Object) As Integer Implements IComparer.Compare
' 規定の戻り値
Dim intCompareResult As Integer = 0
' ソート無しの時
If SortOrder = SortOrder.None Then Return intCompareResult
' 比較対象がListViewItemの時 ( この型で渡される )
If TypeOf x Is ListViewItem AndAlso TypeOf y Is ListViewItem Then
' ListItem型へキャスト
Dim itemX As ListViewItem = CType(x, ListViewItem)
Dim itemY As ListViewItem = CType(y, ListViewItem)
' 比較方法とアイテムから比較すべき文字列を取得
Dim textX As String = itemX.SubItems(ComparisonMode).Text
Dim textY As String = itemY.SubItems(ComparisonMode).Text
' 比較方法別の処理
Select Case ComparisonMode
Case ComparisonMode.ByAge
' 年齢による比較
Dim ageX As Integer = Integer.Parse(textX)
Dim ageY As Integer = Integer.Parse(textY)
' その差を結果とする
intCompareResult = ageX - ageY
Case ComparisonMode.ByBirthDate
' 生年月日による比較
Dim dtmX As DateTime = DateTime.Parse(textX)
Dim dtmY As DateTime = DateTime.Parse(textY)
If dtmX > dtmY Then
intCompareResult = 1
ElseIf dtmX = dtmY Then
intCompareResult = 0
ElseIf dtmX < dtmY Then
intCompareResult = -1
End If
Case ComparisonMode.ByBloodType, ComparisonMode.ByName
' 名前・血液型による比較 ( String型のCompare()メソッドをを流用する )
intCompareResult = String.Compare(textX, textY)
End Select
' 昇順降順の設定による戻り値の符号反転
If SortOrder = SortOrder.Descending Then intCompareResult = -intCompareResult
End If
' 戻り値
Return intCompareResult
End Function
End Class
' フォーム
Public Class ComparisonDialog
Inherits System.Windows.Forms.Form
#Region " Windows フォーム デザイナで生成されたコード "
Public Sub New()
MyBase.New()
' この呼び出しは Windows フォーム デザイナで必要です。
InitializeComponent()
' InitializeComponent() 呼び出しの後に初期化を追加します。
End Sub
' Form は dispose をオーバーライドしてコンポーネント一覧を消去します。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
' Windows フォーム デザイナで必要です。
Private components As System.ComponentModel.IContainer
' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
' Windows フォーム デザイナを使って変更してください。
' コード エディタは使用しないでください。
<System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
'
'ComparisonDialog
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
Me.ClientSize = New System.Drawing.Size(512, 302)
Me.Name = "ComparisonDialog"
Me.Text = "ListViewとIComparerのサンプル"
End Sub
#End Region
' リストビュー
Private listView As listView = Nothing
' リストビューソート順
Private listViewSortOrder As SortOrder
' フォームのLoadイベントハンドラ
Private Sub ComparisonDialog_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
' リストビューのインスタンス
listView = New ListView()
' コントロールリストに追加
Me.Controls.Add(listView)
' 各プロパティを設定
With listView
.Location = New Point(20, 20) ' 位置
.Size = New Size(Me.ClientSize.Width - 40, Me.ClientSize.Height - 40) 'サイズ
.View = View.Details ' ビューのタイプを「詳細」にする
.HeaderStyle = ColumnHeaderStyle.Clickable ' 項目タブをクリック可能にしておく
' イベントハンドラを追加
AddHandler .ColumnClick, AddressOf listView_ColumnClick
End With
' 項目タブを作る
With listView.Columns
.Add("名前", listView.Width * 0.4, HorizontalAlignment.Left)
.Add("生年月日", listView.Width * 0.25, HorizontalAlignment.Left)
.Add("年齢", listView.Width * 0.15, HorizontalAlignment.Left)
.Add("血液型", listView.Width * 0.15, HorizontalAlignment.Left)
End With
' アイテムを追加する
AddListViewItem(listView, "飯田圭織", New DateTime(1981, 8, 8), "A")
AddListViewItem(listView, "安倍なつみ", New DateTime(1981, 8, 10), "A")
AddListViewItem(listView, "保田圭", New DateTime(1980, 12, 6), "A")
AddListViewItem(listView, "矢口真里", New DateTime(1983, 1, 20), "A")
AddListViewItem(listView, "吉澤ひとみ", New DateTime(1985, 4, 12), "O")
AddListViewItem(listView, "石川梨華", New DateTime(1985, 1, 19), "A")
AddListViewItem(listView, "辻希美", New DateTime(1987, 6, 17), "O")
AddListViewItem(listView, "加護亜依", New DateTime(1988, 2, 7), "AB")
AddListViewItem(listView, "小川麻琴", New DateTime(1987, 10, 29), "O")
AddListViewItem(listView, "新垣里沙", New DateTime(1988, 10, 20), "B")
AddListViewItem(listView, "高橋愛", New DateTime(1986, 9, 14), "A")
AddListViewItem(listView, "紺野あさ美", New DateTime(1987, 5, 7), "B")
AddListViewItem(listView, "後藤真希", New DateTime(1985, 9, 23), "O")
AddListViewItem(listView, "松浦亜弥", New DateTime(1986, 6, 25), "B")
AddListViewItem(listView, "藤本美貴", New DateTime(1985, 2, 26), "A")
' ソート順を設定しておく
listViewSortOrder = SortOrder.Ascending
End Sub
' リストビューにアイテムを追加する
Private Sub AddListViewItem(ByVal list As listView, ByVal name As String, ByVal birthDate As DateTime, ByVal bloodType As String)
' 新たなアイテムのインスタンスを作成
Dim item As New ListViewItem()
' 年齢を計算
Dim age As Integer = DateTime.Now.Year - birthDate.Year
Dim birthDayInThisYear As New DateTime(DateTime.Now.Year, birthDate.Month, birthDate.Day)
If birthDayInThisYear > DateTime.Now Then age -= 1
' アイテムのプロパティを設定 ( アイテムは文字列としてしか登録できない )
With item
.Text = name
.SubItems.Add(birthDate.ToShortDateString())
.SubItems.Add(age.ToString())
.SubItems.Add(bloodType)
End With
' リストに追加
list.Items.Add(item)
End Sub
' リストビューのColumnClickイベントハンドラ ( 項目タブをクリックする度に呼び出される )
Private Sub listView_ColumnClick(ByVal sender As Object, ByVal e As ColumnClickEventArgs)
' 昇順・降順を切り替え
If listViewSortOrder = SortOrder.Ascending Then
listViewSortOrder = SortOrder.Descending
Else
listViewSortOrder = SortOrder.Ascending
End If
' 比較担当を作成 ( e.Columnはクリックされた項目タブのインデックス )
Dim comp As New Comparer(e.Column, listViewSortOrder)
' 比較開始 ( このプロパティにICopmarerを指定すると自動的にソートが開始される )
listView.ListViewItemSorter = comp
End Sub
End Class
|