C# 将整数添加到listview以进行排序

C# 将整数添加到listview以进行排序,c#,winforms,listview,C#,Winforms,Listview,我有一个listview,我正在尝试根据列对其进行排序。我让columnclick事件等正常工作,并对其进行排序,但我有以下问题: 我似乎无法将项作为整数添加到listview。这是一个问题,好像我有一列必须使用ToString()的int,排序将10置于2之前 有人知道如何将项目添加为int,以便排序具有所需的功能吗。此外,并非所有列都是int,还有一些字符串列,我希望排序也能处理这些列 作为参考,我对排序代码使用了以下教程: Cheers您可以创建一个实现IComparer的sorter类,

我有一个listview,我正在尝试根据列对其进行排序。我让columnclick事件等正常工作,并对其进行排序,但我有以下问题:

我似乎无法将项作为整数添加到listview。这是一个问题,好像我有一列必须使用
ToString()
的int,排序将10置于2之前

有人知道如何将项目添加为int,以便排序具有所需的功能吗。此外,并非所有列都是int,还有一些字符串列,我希望排序也能处理这些列

作为参考,我对排序代码使用了以下教程:


Cheers

您可以创建一个实现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);
    }
}

您可以创建一个实现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);
    }
}

您可以检测所选列是否有数字。 将其写入比较函数

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

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

您可以检测所选列是否包含数字。 将其写入比较函数

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

如果某列包含数字和文本,则可能会出现问题。

请改用DataGridView。它不要求绑定的数据是
ToString()
'd。请改用DataGridView。它不要求绑定的数据是
ToString()
'd。谢谢,将此(Int32.TryParse)与教程中的代码结合使用,效果非常好。谢谢,将此(Int32.TryParse)与教程中的代码结合使用,效果非常好。