1

我用列表视图构建了一个包含 2 列的数据表,我需要按第二列对数据表进行排序。

它看起来像这样:

Name - Points
------------------
John - 10
Peter - 14
Marcus - 9

那么如何按点数排序呢?

解决了!!

        private class PointsComparer : IComparer
        {
            private const int pointsColumnIndex = 1;

            public int Compare(object x, object y)
            {
                ListViewItem listX = (ListViewItem)x;
                ListViewItem listY = (ListViewItem)y;

                // Convert column text to numbers before comparing.
                // If the conversion fails, just use the value 0.
                decimal listXVal, listYVal;
                try
                {
                    listXVal = Decimal.Parse(listX.SubItems[pointsColumnIndex].Text);
                }
                catch
                {
                    listXVal = 0;
                }

                try
                {
                    listYVal = Decimal.Parse(listY.SubItems[pointsColumnIndex].Text);
                }
                catch
                {
                    listYVal = 0;
                }

                return (-Decimal.Compare(listXVal, listYVal));
            }
        }

这对我来说是一种魅力。

4

8 回答 8

2

使用ListViewItemSorter属性IComparer为您的项目设置自定义。然后简单地调用Sort()方法:

// adding data
listView1.Items.Add(new ListViewItem(new string[] { "John", "10" }));
listView1.Items.Add(new ListViewItem(new string[] { "Peter", "14" }));
listView1.Items.Add(new ListViewItem(new string[] { "Markus", "9" }));
// setting comparer and sorting
listView1.ListViewItemSorter = new PointsComparer();
listView1.Sort();

这是可用于比较点的比较器示例:

private class PointsComparer : IComparer
{
    private const int pointsColumnIndex = 1;

    public int Compare(object x, object y)
    {
        int pointsX = Int32.Parse(((ListViewItem)x).SubItems[pointsColumnIndex].Text);
        int pointsY = Int32.Parse(((ListViewItem)y).SubItems[pointsColumnIndex].Text);
        return pointsX.CompareTo(pointsY);
    }
}

或者,正如我之前发布的,您可以使用来自 msdn 示例的按列文本比较器。

更新:您可以将所需的排序顺序传递给比较器的实例:

private class PointsComparer : IComparer
{
    private const int pointsColumnIndex = 1;
    private SortOrder _sortOrder;            

    public PointsComparer(SortOrder sortOrder)
    {
        _sortOrder = sortOrder;
    }

    public int Compare(object x, object y)
    {
        int pointsX = Int32.Parse(((ListViewItem)x).SubItems[pointsColumnIndex].Text);
        int pointsY = Int32.Parse(((ListViewItem)y).SubItems[pointsColumnIndex].Text);
        int comparisonResult = pointsX.CompareTo(pointsY);

        switch (_sortOrder)
        {
            case SortOrder.Ascending:
                return comparisonResult;
            case SortOrder.Descending:
                return (-1) * comparisonResult;
            default:
                return 0;
        }
    }
}

然后像这样使用它:

listView1.ListViewItemSorter = new PointsComparer(SortOrder.Descending);
于 2012-05-25T14:13:19.463 回答
0

// 根据 ID 对数据进行排序

假设 dt 是您要排序的数据表对象。您可以按照以下说明进行操作:

dt.DefaultView.Sort = "Points ASC"; 

现在 dt 是您的排序数据表

于 2012-05-25T14:00:53.573 回答
0

这帮助我解决了同样的问题。http://support.microsoft.com/kb/319401

我发现我必须调整一些数学,因为当按数字排序时,有时会输入 1、10、11、12、2、20、21 等

于 2012-05-25T14:01:44.217 回答
0

正如 Reniuz 所说,为了在 SQL 查询中获得更好的性能排序,并为 Xtra-gain 在字典或 arrayList 或通用列表( List )中实现它,您也可以使用 Datagridview 在 GUI 上显示 .. SQL 查询语法:

Select [Column1], [Column2] from [YourTable] order by [ColumnWhichYouWantToOrder1], [ColumnWhichYouWantToOrder2] [ {ASC} or {DESC} ] 

语法规则:

  • DESC 排序从最后一个到第一个或从 Z 到 A

  • ASC 排序从第一个到最后一个或从 A 到 Z

  • ASC 是默认值。因此,如果您按 ASC 订购,您可以使用 ..order by [Column] ... 无需编写 ASC

  • 当您对多于 1 列进行排序时,SQL 开始从左列到右列排序。

于 2012-05-25T14:27:34.407 回答
0

做喜欢

datatableinstance.DefaultView.Sort = "Points ASC"; 
于 2012-05-25T13:56:37.773 回答
0
yourDt.DefaultView.Sort = "Points";
DataView dv = yourDt.DefaultView;
于 2012-05-25T13:57:14.280 回答
0
 DataView dv = dt.DefaultView;  
   //apply the sort on CustomerSurname column  
   dv.Sort = "CustomerSurname";  
   //save our newly ordered results back into our datatable  
   dt = dv.ToTable(); 
于 2012-05-25T13:58:55.463 回答
0

这里有一些样本

将以下代码粘贴到 ListView 控件的 ColumnClick 事件中:

 private void listView1_OnColumnClick(object sender, System.Windows.Forms.ColumnClickEventArgs e)
    {
        ListViewSorter Sorter = new ListViewSorter();
        listView1.ListViewItemSorter = Sorter;
        if (!(listView1.ListViewItemSorter is ListViewSorter))
            return;
        Sorter = (ListViewSorter) listView1.ListViewItemSorter;

        if (Sorter.LastSort == e.Column)
        {
            if (listView1.Sorting == SortOrder.Ascending)
                listView1.Sorting = SortOrder.Descending;
            else
                listView1.Sorting = SortOrder.Ascending;
        }
        else{
            listView1.Sorting = SortOrder.Descending;
        }
        Sorter.ByColumn = e.Column;

        listView1.Sort ();
    }

   public class ListViewSorter : System.Collections.IComparer
    {
        public int Compare (object o1, object o2)
        {
            if (!(o1 is ListViewItem))
                return (0);
            if (!(o2 is ListViewItem))
                return (0);

            ListViewItem lvi1 = (ListViewItem) o2;
            string str1 = lvi1.SubItems[ByColumn].Text;
            ListViewItem lvi2 = (ListViewItem) o1;
            string str2 = lvi2.SubItems[ByColumn].Text;

            int result;
            if (lvi1.ListView.Sorting == SortOrder.Ascending)
                result = String.Compare (str1, str2);
            else
                result = String.Compare (str2, str1);

            LastSort = ByColumn;

            return (result);
        }


        public int ByColumn
        {
            get {return Column;}
            set {Column = value;}
        }
        int Column = 0;

        public int LastSort
        {
            get {return LastColumn;}
            set {LastColumn = value;}
        }
        int LastColumn = 0;
    }   

排序示例 http://support.microsoft.com/kb/319401

多排序

http://www.c-sharpcorner.com/uploadfile/nipuntomar/sort-a-multicolumn-listview-in-C-Sharp/

于 2012-05-25T14:21:06.427 回答