1

リストビューを使用して2列のデータテーブルを作成していますが、データテーブルを2番目の列で並べ替える必要があります。

次のようになります。

名前-ポイント
------------------
ジョン-10
ピーター-14
マーカス-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
 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

好きですか

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

//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

ここにいくつかのサンプルがあります

次のコードを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 に答える
0

Reniuzが言ったように、パフォーマンスを向上させるためにSQLクエリ内で順序付けし、Xtra-gainの場合は、辞書、arrayList、またはGeneric List(List)に実装します。また、Datagridviewを使用してGUIに表示することもできます。SQLクエリ構文:

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

構文規則:

  • DESCの順序は、最後のnoから最初またはZからAにソートされます

  • ASCの順序は、最初から最後、またはAからZに並べ替えられます

  • ASCがデフォルトです。したがって、ASCで注文する場合は、[列]で注文するとして使用できます...ASCを記述する必要はありません

  • 複数の列でソートすると、SQLは左の列から右の列への順序付けを開始します。

于 2012-05-25T14:27:34.407 に答える