C# 按列排序列表视图?

C# 按列排序列表视图?,c#,winforms,C#,Winforms,我正在用listview构建一个包含两列的datatable,我需要按第二列对datatable进行排序 它看起来像这样: listView1.ListViewItemSorter = new PointsComparer(SortOrder.Descending); 点名 --------- 约翰-10 彼得-14 马库斯-9 那么我如何按点数排序呢? 解决了的!! 这对我来说很有魅力。喜欢吗 datatableinstance.DefaultView.Sort = "Points AS

我正在用listview构建一个包含两列的datatable,我需要按第二列对datatable进行排序

它看起来像这样:

listView1.ListViewItemSorter = new PointsComparer(SortOrder.Descending);
点名 --------- 约翰-10 彼得-14 马库斯-9 那么我如何按点数排序呢? 解决了的!!

这对我来说很有魅力。

喜欢吗

datatableinstance.DefaultView.Sort = "Points ASC"; 
//基于ID对数据进行排序

假设dt是要排序的datatable对象。你可以随心所欲 如下所述:

现在dt是您的排序数据表


这帮我解决了同样的问题


我发现我必须调整一些数学,因为在按数字排序时,有时会放入1、10、11、12、2、20、21等。使用属性为项目设置自定义IComparer。然后只需调用排序方法:

以下是比较器示例,可用于比较点:

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);
这是一些样品

将以下代码粘贴到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 ();
    }
分类样本

多重排序


正如Reniuz所说,为了获得更好的性能,在SQL查询中对其进行排序,并在字典、arrayList或通用列表中实现它,还可以使用Datagridview在GUI上显示。。SQL查询语法:

Select [Column1], [Column2] from [YourTable] order by [ColumnWhichYouWantToOrder1], [ColumnWhichYouWantToOrder2] [ {ASC} or {DESC} ] 
语法规则:

Select [Column1], [Column2] from [YourTable] order by [ColumnWhichYouWantToOrder1], [ColumnWhichYouWantToOrder2] [ {ASC} or {DESC} ] 
描述排序从最后一个否排序到第一个或从Z排序到A

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

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

当使用多个列进行排序时,SQL开始从左到右排序


如果您以后不需要重新排序,您可以在select查询中进行排序。是winforms还是什么?奇怪的是,它与我的答案非常相似。属性为您的项目设置自定义IComparer。什么?如果您使用的是winforms,则ListView控件具有属性ListViewItemSorter。创建您自己的分拣机,该分拣机比较项目并将其设置为listview分拣机。如果您想要下行分拣,请使用return pointsY.CompareTopointsX;相反,或者将比较结果乘以-1,这并不是我想要的。您希望在datatable或listview上进行排序,您希望在其中对数据进行排序。如果在DT上,则可以使用dataview将数据排序为DT.DefaultView.sort=点ASC;我希望能够单击一个按钮对第二列进行排序,以便在我动态添加项目后对其进行排序
listView1.ListViewItemSorter = new PointsComparer(SortOrder.Descending);
 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;
    }   
Select [Column1], [Column2] from [YourTable] order by [ColumnWhichYouWantToOrder1], [ColumnWhichYouWantToOrder2] [ {ASC} or {DESC} ]