CheckBoxの付いたListViewの項目を並び替える †
「ListViewの項目を並び替える: .NET Tips」で紹介しているListViewItemComparerクラスを拡張し、チェックボックスの付いたListViewの項目を並び替えるようにしたコードの一部をMyaさんからメールで送って頂きました(経過は「ListViewの項目を並び替える」のコメントをご覧ください)。このまま眠らせておくのはあまりにもったいないので、ここにコードの部分だけ引用させて頂きます。
メールを送っていただいたMyaさんに改めて感謝いたします。
// 実際のソート処理が行われるCompare関数(どうやらSort()内で呼び出される関数らしいです)。
// この処理は[-1( X < Y )],[ 0( X = Y )],[ 1( X > Y )],の何れかを返すようにする処理です。
public int Compare( object x, object y )
{
// TODO: ListViewSorter.Compare 実装を追加します。
// 比較演算の結果を格納する変数。格納されるのは上記の通り、[ 1], [ 0], [-1]の何れか。
int intResult = INT_RESULT_EQUAL;
// ListViewの獲得。
ListViewItem itemX = ( ListViewItem ) x;
ListViewItem itemY = ( ListViewItem ) y;
// Sortの対象変数型を獲得。
if( intNowComparerMode != INT_NOT_SET_COMPARER_MODE )
intNowComparerMode = intAllComparerMode[ intColumnIndex ];
// 現在の比較対象であるXとYの変数型に合わせて比較処理を行う。
switch( intNowComparerMode )
{
case INT_MODE_STRING: // COMPARER_MODE.INT_STRING: 文字列比較処理
intResult = string.Compare( itemX.SubItems[ intColumnIndex ].Text, itemY.SubItems[ intColumnIndex ].Text );
break;
case INT_MODE_INTEGER: // 整数比較処理
intResult = int.Parse( itemX.SubItems[ intColumnIndex ].Text ) - int.Parse( itemY.SubItems[ intColumnIndex ].Text );
break;
case INT_MODE_DATE_TIME: // 日付比較処理
intResult = DateTime.Compare(
DateTime.Parse( itemX.SubItems[ intColumnIndex ].Text ), DateTime.Parse( itemY.SubItems[ intColumnIndex ].Text ));
break;
// 比較演算のSort処理も追加を試みます。20100523_2239_Writen_by_********
case INT_MODE_BOOL: // CheckBoxの比較処理
// 比較処理。双方、値が違っていればfalse、等しければtrueを返します。
bool bolOrderFlag;
bool bolEqualCheckX;
bool bolEqualCheckY;
// 昇り順か降り順かによってCheckBoxがCheckされているListViewItemを上に持ってくるか下に持ってくるか決定します。
if( NowSetComparerOrder == SortOrder.Ascending )
bolOrderFlag = true;
else
bolOrderFlag = false;
// チェックボックスの状態を判定。
bolEqualCheckX = bool.Equals( bolOrderFlag, itemX.Checked );
bolEqualCheckY = bool.Equals( bolOrderFlag, itemY.Checked );
if( bolEqualCheckX == bolEqualCheckY == true )
{
// itemXとitemYのCheckBoxが双方、共に並び順と等しいなら全てtrue。
// この[true]は「CheckBoxがチェックされている」という状態ではなく「頭に持ってくるフラグ状態である」という意味なので誤解無きよう。
intResult = 0;
}
else
{
// 此処は全て上記の条件が是。つまりitemX.CheckedとitemY.Checkedが異なっているか両方共にfalseかのどちらかです。
// つまり上記の理由より、この条件文の中ではintResultは[ 1]か[-1]しか持ち得ません。
// 一先ず全ての組み合わせに対して変数をセットします。愚直に愚直に。組み合わせ数も最大で四通りだしねー。
if( bolEqualCheckX == bolEqualCheckY )
{
// 双方共にfalse。この場合がよく分からん。
intResult = 1;
}
else
{
// 両方の値が違う。
if( bolEqualCheckX == true )
intResult = -1;
else
intResult = 1;
}
}
if( NowSetComparerOrder == SortOrder.Descending )
intResult = -intResult; // 降り順の場合は数値を反転し[-1]にする。
// ※上記処理をして下で行われる同様の処理を打ち消さないと、INT_MODE_BOOLだけはSortOrderに昇降順を依存しないのでColumnを二回クリックしたときに反転しません。
// この処理、上で上手く併せれば無くせると思うんですが……。もう頭痛いので止めます。後は任せた……。
break;
}
// 昇り順か降り順かを戻り値に反映。
if( NowSetComparerOrder == SortOrder.Descending )
intResult = -intResult; // 降り順の場合は数値を反転し[-1]にする
else if( NowSetComparerOrder == SortOrder.None )
intResult = INT_RESULT_EQUAL;
// 結果を返します。
return intResult;
}
|
コメント †