*CheckBoxの付いたListViewの項目を並び替える [#w4be97bb] 「[[ListViewの項目を並び替える: .NET Tips>http://dobon.net/vb/dotnet/control/lvitemsort.html]]」で紹介しているListViewItemComparerクラスを拡張し、チェックボックスの付いたListViewの項目を並び替えるようにしたコードの一部をMyaさんからメールで送って頂きました(経過は「ListViewの項目を並び替える」のコメントをご覧ください)。このまま眠らせておくのはあまりにもったいないので、ここにコードの部分だけ引用させて頂きます。 「[[ListViewの項目を並び替える: .NET Tips>https://dobon.net/vb/dotnet/control/lvitemsort.html]]」で紹介しているListViewItemComparerクラスを拡張し、チェックボックスの付いたListViewの項目を並び替えるようにしたコードの一部をMyaさんからメールで送って頂きました(経過は「ListViewの項目を並び替える」のコメントをご覧ください)。このまま眠らせておくのはあまりにもったいないので、ここにコードの部分だけ引用させて頂きます。 メールを送っていただいたMyaさんに改めて感謝いたします。 #prescroll{{ // 実際のソート処理が行われる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; } }} **コメント [#o389476f] #comment //これより下は編集しないでください #pageinfo(,2012-02-07 (火) 01:50:42,DOBON!,2012-02-07 (火) 01:50:42,DOBON!) |