日期:2014-05-18  浏览次数:21113 次

listview 如何实现多列排序
listview 多列排序问题,请问如何解决。

------解决方案--------------------
就是击标题就排序吗
------解决方案--------------------
请描述清楚!
------解决方案--------------------
点击标题就排序,无须重读数据库的解决方法:

#region 自定义变量,ListView1排序时需要用到这两个变量

int currentCol = -1;
bool sort;

 #endregion

//写一个排序类

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Windows.Forms;

 

namespace jw
{
class ListViewColumnSorter : IComparer
{
public bool sort_b;
public SortOrder order = SortOrder.Ascending;

private int col;

public ListViewColumnSorter()
{
col = 0;
}

public ListViewColumnSorter(int column, bool sort)
{
col = column;
sort_b = sort;
}

public int Compare(object x, object y)
{
if (sort_b)
{
return String.Compare(((ListViewItem)x).SubItems[col].Text, ((ListViewItem)y).SubItems[col].Text);
}
else
{
return String.Compare(((ListViewItem)y).SubItems[col].Text, ((ListViewItem)x).SubItems[col].Text);
}
}

}

}


//写listView1_ColumnClick事件

private void listView1_ColumnClick(object sender, ColumnClickEventArgs e)
{
string Asc = ((char)0x25bc).ToString().PadLeft(4, ' ');
string Des = ((char)0x25b2).ToString().PadLeft(4, ' ');

if (sort == false)
{
sort = true;
string oldStr = this.listView1.Columns[e.Column].Text.TrimEnd((char)0x25bc, (char)0x25b2, ' ');
this.listView1.Columns[e.Column].Text = oldStr + Des;
}
else if (sort == true)
{
sort = false;
string oldStr = this.listView1.Columns[e.Column].Text.TrimEnd((char)0x25bc, (char)0x25b2, ' ');
this.listView1.Columns[e.Column].Text = oldStr + Asc;
}

listView1.ListViewItemSorter = new ListViewColumnSorter(e.Column, sort);
this.listView1.Sort();
int rowCount = this.listView1.Items.Count;
if (currentCol != -1)
{
for (int i = 0; i < rowCount; i++)
{
this.listView1.Items[i].UseItemStyleForSubItems = false;
this.listView1.Items[i].SubItems[currentCol].BackColor = Color.White;

if (e.Column != currentCol)
this.listView1.Columns[currentCol].Text = this.listView1.Columns[currentCol].Text.TrimEnd((char)0x25bc, (char)0x25b2, ' ');
}
}

for (int i = 0; i < rowCount; i++)
{
this.listView1.Items[i].UseItemStyleForSubItems = false;
this.listView1.Items[i].SubItems[e.Column].BackColor = Color.WhiteSmoke;
currentCol = e.Column;
}

}


------解决方案--------------------
所谓多列排序,就是按照顺序来依次给各个列排序。

排序选择稳定的算法。也就是遇到相同的项目,排序之后相同的项目的次序不变即可。

选择排序、快速排序、希尔排序、堆排序不是稳定的排序算法,而冒泡排序、插入排序、归并排序和基数排序是稳定的排序算法。