对ListView进行排序时出现如图文件夹与文件混在一起,希望文件夹在上,文件在下

hzjhyp522 2009-06-15 03:56:43
对ListView进行排序时出现文件夹与文件混在一起,希望文件夹在上,文件在下。

但是暂存至其他listView,再复制进listView1里,排序依然是乱的。请高手指教。

listView1.Items.Clear();
string paths = @textBoxFilePath.Text;
ListView listView3 = new ListView();
ForeachDirs(listView3, paths);//把文件夹暂存至listview3
listView3.Sort();//给listView3里的文件夹排序
//把listView3里的文件夹,添加到listView1。
foreach (ListViewItem item in listView3.Items)
{
listView1.Items.Add((ListViewItem)item.Clone());
}
//this.listView1.Sort();
ListView listView2 = new ListView();
ForeachFiles(listView2, paths);//把文件暂存至listview2
listView2.Sort();//给listView2里的文件排序
//把listView2里的文件夹,添加到listView1。
foreach (ListViewItem item in listView2.Items)
{
listView1.Items.Add((ListViewItem)item.Clone());
}
...全文
130 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzwwb1 2009-06-18
  • 打赏
  • 举报
回复
你试试这个,这个可以实现listview中点击列排序,不知道适用不适用你的情况

在C#中实现对ListView点击列标题自动排序功能
先定义一个ListViewHelper类,代码如下:

using System;
using System.Collections;
using System.Windows.Forms;

namespace Common
{
/// <summary>
/// 对ListView点击列标题自动排序功能
/// </summary>
public class ListViewHelper
{
/// <summary>
/// 构造函数
/// </summary>
public ListViewHelper()
{
//
// TODO: 在此处添加构造函数逻辑
//
}

public static void ListView_ColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
{
System.Windows.Forms.ListView lv = sender as System.Windows.Forms.ListView;
// 检查点击的列是不是现在的排序列.
if (e.Column == (lv.ListViewItemSorter as ListViewColumnSorter).SortColumn)
{
// 重新设置此列的排序方法.
if ((lv.ListViewItemSorter as ListViewColumnSorter).Order == System.Windows.Forms.SortOrder.Ascending)
{
(lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Descending;
}
else
{
(lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Ascending;
}
}
else
{
// 设置排序列,默认为正向排序
(lv.ListViewItemSorter as ListViewColumnSorter).SortColumn = e.Column;
(lv.ListViewItemSorter as ListViewColumnSorter).Order = System.Windows.Forms.SortOrder.Ascending;
}
// 用新的排序方法对ListView排序
((System.Windows.Forms.ListView)sender).Sort();
}
}

/// <summary>
/// 继承自IComparer
/// </summary>
public class ListViewColumnSorter : System.Collections.IComparer
{
/// <summary>
/// 指定按照哪个列排序
/// </summary>
private int ColumnToSort;
/// <summary>
/// 指定排序的方式
/// </summary>
private System.Windows.Forms.SortOrder OrderOfSort;
/// <summary>
/// 声明CaseInsensitiveComparer类对象
/// </summary>
private System.Collections.CaseInsensitiveComparer ObjectCompare;

/// <summary>
/// 构造函数
/// </summary>
public ListViewColumnSorter()
{
// 默认按第一列排序
ColumnToSort = 0;

// 排序方式为不排序
OrderOfSort = System.Windows.Forms.SortOrder.None;

// 初始化CaseInsensitiveComparer类对象
ObjectCompare = new System.Collections.CaseInsensitiveComparer();
}

/// <summary>
/// 重写IComparer接口.
/// </summary>
/// <param name="x">要比较的第一个对象</param>
/// <param name="y">要比较的第二个对象</param>
/// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
public int Compare(object x, object y)
{
int compareResult;
System.Windows.Forms.ListViewItem listviewX, listviewY;

// 将比较对象转换为ListViewItem对象
listviewX = (System.Windows.Forms.ListViewItem)x;
listviewY = (System.Windows.Forms.ListViewItem)y;

string xText = listviewX.SubItems[ColumnToSort].Text;
string yText = listviewY.SubItems[ColumnToSort].Text;

int xInt, yInt;

// 比较,如果值为IP地址,则根据IP地址的规则排序。
if (IsIP(xText) && IsIP(yText))
{
compareResult = CompareIp(xText, yText);
}
else if (int.TryParse(xText, out xInt) && int.TryParse(yText, out yInt)) //是否全为数字
{
//比较数字
compareResult = CompareInt(xInt, yInt);
}
else
{
//比较对象
compareResult = ObjectCompare.Compare(xText, yText);
}

// 根据上面的比较结果返回正确的比较结果
if (OrderOfSort == System.Windows.Forms.SortOrder.Ascending)
{
// 因为是正序排序,所以直接返回结果
return compareResult;
}
else if (OrderOfSort == System.Windows.Forms.SortOrder.Descending)
{
// 如果是反序排序,所以要取负值再返回
return (-compareResult);
}
else
{
// 如果相等返回0
return 0;
}
}

/// <summary>
/// 判断是否为正确的IP地址,IP范围(0.0.0.0~255.255.255)
/// </summary>
/// <param name="ip">需验证的IP地址</param>
/// <returns></returns>
public bool IsIP(String ip)
{
return System.Text.RegularExpressions.Regex.Match(ip, @"^(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\.(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])$").Success;
}

/// <summary>
/// 比较两个数字的大小
/// </summary>
/// <param name="ipx">要比较的第一个对象</param>
/// <param name="ipy">要比较的第二个对象</param>
/// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
private int CompareInt(int x, int y)
{
if (x > y)
{
return 1;
}
else if (x < y)
{
return -1;
}
else
{
return 0;
}
}

/// <summary>
/// 比较两个IP地址的大小
/// </summary>
/// <param name="ipx">要比较的第一个对象</param>
/// <param name="ipy">要比较的第二个对象</param>
/// <returns>比较的结果.如果相等返回0,如果x大于y返回1,如果x小于y返回-1</returns>
private int CompareIp(string ipx, string ipy)
{
string[] ipxs = ipx.Split('.');
string[] ipys = ipy.Split('.');

for (int i = 0; i < 4; i++)
{
if (Convert.ToInt32(ipxs[i]) > Convert.ToInt32(ipys[i]))
{
return 1;
}
else if (Convert.ToInt32(ipxs[i]) < Convert.ToInt32(ipys[i]))
{
return -1;
}
else
{
continue;
}
}
return 0;
}

/// <summary>
/// 获取或设置按照哪一列排序.
/// </summary>
public int SortColumn
{
set
{
ColumnToSort = value;
}
get
{
return ColumnToSort;
}
}

/// <summary>
/// 获取或设置排序方式.
/// </summary>
public System.Windows.Forms.SortOrder Order
{
set
{
OrderOfSort = value;
}
get
{
return OrderOfSort;
}
}
}
}


以上代码封装后无须更改,在窗体中添加一个ListView控件,在窗体的Load事件中添加如下代码:

private void Form1_Load(object sender, EventArgs e)
{
this.listView1.ListViewItemSorter = new Common.ListViewColumnSorter();
this.listView1.ColumnClick += new ColumnClickEventHandler(Common.ListViewHelper.ListView_ColumnClick);
}
hzjhyp522 2009-06-18
  • 打赏
  • 举报
回复
升起来,请高手指点啊
hzjhyp522 2009-06-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yuwenge 的回复:]
文件夹属性作为排序的先决条件即可
[/Quote]

您的意思是不是不用分别在其他listview里排序,只要在listview1里排就行?
把文件夹属性作为排序的先决条件的操作步骤是什么?谢谢
卧_槽 2009-06-17
  • 打赏
  • 举报
回复
文件夹属性作为排序的先决条件即可
hzjhyp522 2009-06-17
  • 打赏
  • 举报
回复
一下子又沉得见底了,上来,给高手看看。
hzjhyp522 2009-06-16
  • 打赏
  • 举报
回复
拜托哪位高手给解决一下,没有代码说说思路也行。最好能具体些。先谢过了。
happyboyxq 2009-06-16
  • 打赏
  • 举报
回复
foreach (string path in 文件夹路径集合)
{
ListViewItem lv1 = new ListViewItem(Path.GetFileName(path));
lv1.Tag = path;
lv1.SubItems.Add("文件夹");
listView1.Items.Add(lv1);
}
这样就可以按顺序排了,文件同理。其实和你的方法差不多。
hzjhyp522 2009-06-16
  • 打赏
  • 举报
回复
我目标listview的确是没有排序的。是在listview2和listview3里分别排序再添加进listview1的。
射天狼 2009-06-16
  • 打赏
  • 举报
回复
目标listview不要排序,在临时listview分别对文件夹、文件排好序之后,插入到目标listview里。
或者,对排序列进行设置,如:在排序列之前加入0表示文件夹,1表示文件,这样,0在1前面。顺序就不会乱。
只是个建议,仅供参考

天狼工作室 http://www.j2soft.cn/
hzjhyp522 2009-06-16
  • 打赏
  • 举报
回复
求人指点,顶
hzjhyp522 2009-06-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 happyboyxq 的回复:]
foreach (string path in 文件夹路径集合)
{
ListViewItem lv1 = new ListViewItem(Path.GetFileName(path));
lv1.Tag = path;
lv1.SubItems.Add("文件夹");
listView1.Items.Add(lv1);
}
这样就可以按顺序排了,文件同理。其实和你的方法差不多。
[/Quote]

好像不解决问题

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧