2010-11-03 19 views
1

我有一个列表视图,我试图根据列进行排序。我有columnclick事件等工作,并进行排序,但我有以下问题:添加ints到列表视图进行排序

我似乎无法将项目添加到列表视图为整数。这是一个问题,因为如果我有一列整数,我不得不使用ToString()上,排序将10提前10。

有谁知道我可以添加项目作为int的,以便该排序具有所需的功能。另外,并不是所有的列都是int,所以有一些字符串列,我希望排序也适用于这些列。

仅供参考,我用于排序的代码下面的教程:http://support.microsoft.com/kb/319401

干杯

+0

改为使用DataGridView。它不要求绑定的数据是'ToString()''d。 – leppie 2010-11-03 11:46:48

回答

1

如果所选列有数字可以检测。在比较功能

  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); 
      } 

写这也许是问题,如果一些列包含数字和文本。

+0

谢谢,将这个(Int32.TryParse)与本教程中的代码结合起来,它完美地工作。 – AndrewC 2010-11-03 12:23:18

3

您可以创建一个实现IComparer的分拣器类,并将其分配给ListView的ListViewItemSorter财产。

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

您可以创建一个用于创建列的字符串值,但还保持着原来的int值,以避免在比较器的int.Parse调用自己的ListViewItem类。

未经测试的例子:

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); 
    } 
}