ListView 排序
声明一下,本人在日文系统上做开发,所以,发个日文代码,主要功能实现对LISTVIEW的单击列时进行排序,
首先重写一个类,然在事件中写入下面代码就可以了.
private void lstTest1_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
// リストビュー選択の場合
if (lstTest1.SelectedItems.Count != 0)
{
lstTest1.SelectedItems.Clear();
}
//
if (e.Column != m_iSortColumn)
{
m_iSortColumn = e.Column;
// 指定ソート種類
lstTest1.Sorting = SortOrder.Ascending;
}
else
{
// 前のソート型によって、指定列のソート型を設定
if (lstTest1.Sorting == SortOrder.Ascending)
{
lstTest1.Sorting = SortOrder.Descending;
}
else
{
lstTest1.Sorting = SortOrder.Ascending;
}
}
// ソート処理を実行
lstTest1.Sort();
// 指定列によって、ソートを実行
lstTest1.ListViewItemSorter =
new JasPine.ListViewItemComparer(e.Column,lstTest1.Sorting);
}
================================================================================
namespace JasPine
{
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
// 排序实现类
//********************************************************************
/// <summary>
/// FormCommon の概要の説明です。
/// </summary>
//********************************************************************
public class FormCommon
{
public FormCommon()
{
//
// TODO: コンストラクタ ロジックをここに追加してください。
//
}
}
//********************************************************************
/// <summary>
/// リストビューのソートのクラスである。
/// </summary>
//********************************************************************
public class ListViewItemComparer : IComparer
{
// リストビューの列を指定
private int m_iColumn;
// ソート種類を指定
private SortOrder m_Order;
//********************************************************************
/// <summary>
/// リストビューのソートのコンストラクタ。
/// </summary>
//********************************************************************
public ListViewItemComparer()
{
m_iColumn = 0;
m_Order = SortOrder.Ascending;
}
//********************************************************************
/// <summary>
/// リストビューのソートのコンストラクタ。
/// </summary>
/// <param name="iColumn">リストビューの列を指定する</param>
/// <param name="oOrder">ソート種類を指定する</param>
//********************************************************************
public ListViewItemComparer(int iColumn, SortOrder oOrder)
{
m_iColumn = iColumn;
m_Order = oOrder;
}
//********************************************************************
/// <summary>
/// 比較処理
/// </summary>
/// <param name="x">比較対象</param>
/// <param name="y">比較対象</param>
/// <returns></returns>
//********************************************************************
public int Compare2(object x, object y)
{
int iReturnVal = -1;
// 比較処理
iReturnVal = String.Compare(
((ListViewItem)x).SubItems[m_iColumn].Text,
((ListViewItem)y).SubItems[m_iColumn].Text);
// 降順を設定
if(m_Order == SortOrder.Descending)
{
iReturnVal *= -1;
}
return iReturnVal;
}
//************************************************************************
/// <summary>
/// 比較処理
/// </summary>
/// <param name="x">比較対象: x </param>
/// <param name="y">比較対象: y </param>
/// <returns>正数: x より小さい y 0: x と等しい y 負数: x より大きい y
/// </returns>
//************************************************************************
public int Compare(object x, object y)
{
// 返却値
int iReturnVal = -1;
// 比較対象
string strTemp1 = ((ListViewItem)x).SubItems[m_iColumn].Text;
string strTemp2 = ((ListViewItem)y).SubItems[m_iColumn].Text;
try
{
// タイプの変換
Convert.ToInt64(strTemp1);
Convert.ToInt64(strTemp2);
// 同じ長さの変換
if (strTemp1.Length > strTemp2.Length)
{
strTemp2 = strTemp2.PadLeft(strTemp1.Length,'0');
}
else
{
strTemp1 = strTemp1.PadLeft(strTemp2.Length,'0');
}
// 数字の大小の比較
iReturnVal = String.Compare(strTemp1,strTemp2);
}
catch
{
// 変換異常の場合、AscII の比較
// 比較処理
iReturnVal = String.Compare(strTemp1,strTemp2);
}
// 降順を設定
if(m_Order == SortOrder.Descending)
{
iReturnVal *= -1;
}
return iReturnVal;
}
}
}
声明一下,本人在日文系统上做开发,所以,发个日文代码,主要功能实现对LISTVIEW的单击列时进行排序,
首先重写一个类,然在事件中写入下面代码就可以了.
private void lstTest1_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
// リストビュー選択の場合
if (lstTest1.SelectedItems.Count != 0)
{
lstTest1.SelectedItems.Clear();
}
//
if (e.Column != m_iSortColumn)
{
m_iSortColumn = e.Column;
// 指定ソート種類
lstTest1.Sorting = SortOrder.Ascending;
}
else
{
// 前のソート型によって、指定列のソート型を設定
if (lstTest1.Sorting == SortOrder.Ascending)
{
lstTest1.Sorting = SortOrder.Descending;
}
else
{
lstTest1.Sorting = SortOrder.Ascending;
}
}
// ソート処理を実行
lstTest1.Sort();
// 指定列によって、ソートを実行
lstTest1.ListViewItemSorter =
new JasPine.ListViewItemComparer(e.Column,lstTest1.Sorting);
}
================================================================================
namespace JasPine
{
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
// 排序实现类
//********************************************************************
/// <summary>
/// FormCommon の概要の説明です。
/// </summary>
//********************************************************************
public class FormCommon
{
public FormCommon()
{
//
// TODO: コンストラクタ ロジックをここに追加してください。
//
}
}
//********************************************************************
/// <summary>
/// リストビューのソートのクラスである。
/// </summary>
//********************************************************************
public class ListViewItemComparer : IComparer
{
// リストビューの列を指定
private int m_iColumn;
// ソート種類を指定
private SortOrder m_Order;
//********************************************************************
/// <summary>
/// リストビューのソートのコンストラクタ。
/// </summary>
//********************************************************************
public ListViewItemComparer()
{
m_iColumn = 0;
m_Order = SortOrder.Ascending;
}
//********************************************************************
/// <summary>
/// リストビューのソートのコンストラクタ。
/// </summary>
/// <param name="iColumn">リストビューの列を指定する</param>
/// <param name="oOrder">ソート種類を指定する</param>
//********************************************************************
public ListViewItemComparer(int iColumn, SortOrder oOrder)
{
m_iColumn = iColumn;
m_Order = oOrder;
}
//********************************************************************
/// <summary>
/// 比較処理
/// </summary>
/// <param name="x">比較対象</param>
/// <param name="y">比較対象</param>
/// <returns></returns>
//********************************************************************
public int Compare2(object x, object y)
{
int iReturnVal = -1;
// 比較処理
iReturnVal = String.Compare(
((ListViewItem)x).SubItems[m_iColumn].Text,
((ListViewItem)y).SubItems[m_iColumn].Text);
// 降順を設定
if(m_Order == SortOrder.Descending)
{
iReturnVal *= -1;
}
return iReturnVal;
}
//************************************************************************
/// <summary>
/// 比較処理
/// </summary>
/// <param name="x">比較対象: x </param>
/// <param name="y">比較対象: y </param>
/// <returns>正数: x より小さい y 0: x と等しい y 負数: x より大きい y
/// </returns>
//************************************************************************
public int Compare(object x, object y)
{
// 返却値
int iReturnVal = -1;
// 比較対象
string strTemp1 = ((ListViewItem)x).SubItems[m_iColumn].Text;
string strTemp2 = ((ListViewItem)y).SubItems[m_iColumn].Text;
try
{
// タイプの変換
Convert.ToInt64(strTemp1);
Convert.ToInt64(strTemp2);
// 同じ長さの変換
if (strTemp1.Length > strTemp2.Length)
{
strTemp2 = strTemp2.PadLeft(strTemp1.Length,'0');
}
else
{
strTemp1 = strTemp1.PadLeft(strTemp2.Length,'0');
}
// 数字の大小の比較
iReturnVal = String.Compare(strTemp1,strTemp2);
}
catch
{
// 変換異常の場合、AscII の比較
// 比較処理
iReturnVal = String.Compare(strTemp1,strTemp2);
}
// 降順を設定
if(m_Order == SortOrder.Descending)
{
iReturnVal *= -1;
}
return iReturnVal;
}
}
}