代码之家  ›  专栏  ›  技术社区  ›  AndrewC

向ListView添加ints以进行排序

  •  1
  • AndrewC  · 技术社区  · 14 年前

    我有一个ListView,我正试图基于列对其进行排序。我让columnclick事件等工作,并进行排序,但我有以下问题:

    我似乎无法将项作为整数添加到ListView中。这是一个问题,好像我有一列必须使用的ints ToString() 在上,排序将10放在2的前面。

    是否有人知道如何将项作为int添加,以便排序具有所需的功能?而且,不是所有列都是int,有一些字符串列,我希望排序也能处理这些列。

    作为参考,我对排序代码使用了以下教程: http://support.microsoft.com/kb/319401

    干杯

    2 回复  |  直到 14 年前
        1
  •  1
  •   user386349    14 年前

    您可以检测所选列是否有数字。 在比较函数中写这个

                int intX = 0, intY = 0;
                if(int.TryParse(listviewX.SubItems[ColumnToSort].Text, out intX)
                    && int.TryParse(listviewY.SubItems[ColumnToSort].Text, out intY))
                {
                    return intX.CompareTo(inty);
                }
    

    如果某列包含数字和文本,则可能是问题所在。

        2
  •  3
  •   testalino    14 年前

    可以创建实现IComparer的Sorter类,并将其分配给ListView的ListViewItemSorter属性。

    IComparer具有方法比较。向该方法传递了两个ListViewItem实例。您需要读取列值,然后将其解析为int并返回正确的比较结果(基于int而不是基于字符串)。

    您可以创建自己的listViewItem类,该类为列创建字符串值,但还保留原始int值,以避免在比较器中进行int.parse调用。

    未测试示例:

    public class MyItemComparer : IComparer
    {
        public int Compare(object x, object y)
        {
            ListViewItem xItem = (ListViewItem)x;
            ListViewItem yItem = (ListViewItem)y;
    
            int a = int.Parse(xItem.SubItems[0]);
            int b = int.Parse(yItem.SubItems[0]);
            return a.CompareTo(b);
        }
    }