为WinForms实现自定义排序ListView
我有一个名为Picture
的类,它有一个名称和size
(int
)属性。为WinForms实现自定义排序ListView
我打算使用大小对它们进行排序,但不是listview
中的项目名称显示的文件名。
我实现IComparer<Picture>
为Picture
类型,然后当我写这篇文章:
this.PicList.ListViewItemSorter = AllPictures[0];
或
this.PicList.ListViewItemSorter = Picture;
他们不进行编译。
我该怎么做?在MSDN上它为分拣机显示了一个单独的类,但我可以使用内置的类型Picture
吗?
你需要给它一个Picture类的实例,而不是类型。此外,您的ListViewItemSorter实际上会通过将ListViewItem而不是Picture类传递给比较器,您可以将Picture类的实例添加到ListViewItem的Tag属性中。
就像这样,这是一个非常粗糙的实现,只是为了给你一个想法。你可以实现你自己的错误处理。
Picture test1 = new Picture() { Name = "Picture #1", Size = 54 };
Picture test2 = new Picture() { Name = "Picture #2", Size = 10 };
this.listView1.ListViewItemSorter = test1;
this.listView1.Items.Add(new ListViewItem(test1.Name) { Tag = test1 });
this.listView1.Items.Add(new ListViewItem(test2.Name) { Tag = test2 });
public class Picture : IComparer
{
public string Name { get; set; }
public int Size { get; set; }
#region IComparer Members
public int Compare(object x, object y)
{
Picture itemA = ((ListViewItem)x).Tag as Picture;
Picture itemB = ((ListViewItem)y).Tag as Picture;
if (itemA.Size < itemB.Size)
return -1;
if (itemA.Size > itemB.Size)
return 1;
if (itemA.Size == itemB.Size)
return 0;
return 0;
}
输出是:
- 图片#2
- 图片#1
这里是一个MSDN Link
谢谢。这是我需要的。这让我意识到排序不应该是图片类型的一部分。我认为它使用图片类型,而不是ListViewItem。现在很明显。 – 2009-07-15 09:14:49
你可以尝试另一种实现是每个ListViewItem
关联索引与您的自定义类/结构实例存储在一个Dictionary<int, Picture>
实例。您的自定义列表视图分拣类可以用这一点来写,像这样:
public partial class Form1 : Form
{
public Form1()
{
...
ListView lv = new ListView();
lv.ListViewItemSorter = new MyCustomSorter(this);
}
private Dictionary<int, Picture> _pictures = new Dictionary<int,Picture>();
private class MyCustomSorter : IComparer
{
private Form1 _parent;
internal MyCustomSorter(Form1 form)
{
_parent = form;
}
#region IComparer Members
public int Compare(object x, object y)
{
ListViewItem item1 = x as ListViewItem;
ListViewItem item2 = y as ListViewItem;
if (x != null)
{
if (y != null)
{
Picture p1 = _parent._pictures[item1.Index];
Picture p2 = _parent._pictures[item2.Index];
return string.Compare(p1.Location, p2.Location);
}
// X is deemed "greater than" y
return 1;
}
else if (y != null)
return -1; // x is "less than" y
return 0;
}
#endregion
}
}
public class Picture
{
private string _location;
public string Location{
get { return _location; }
}
}
斯坦的解决方案将工作,但是,代表用户的,我强烈建议你不要硬编码排序顺序。在ListView中,每个人都希望能够通过单击标题进行排序。
ObjectListView(.NET WinForms ListView的开放源代码包装)提供免费的排序功能。如果您想要,它甚至可以在自己的专栏中显示您的照片的缩略图。
是的。我完全同意。我只是向他展示了一个实现以及为什么他不工作。但我同意它应该在列标题上完成。 – 2009-07-15 12:56:27
图片是一种类型?你需要给它一个Picture的实例,而不是类型。什么是错误? – 2009-07-15 00:29:41
是的,这是一个结构。该错误是无法将图片转换为IComparer。在#1中,我传递了一个不起作用的实例。 – 2009-07-15 00:31:23
为什么有人低估了它?这是一个有效的问题。 – 2009-07-15 09:15:31