• 追加された行はこの色です。
  • 削除された行はこの色です。
*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!)


[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]