简体   繁体   English

C# 在列标题单击时对 datagridview 进行排序

[英]C# sort datagridview on column header click

:) I have a datagridview and I fill it by List (I get data from 2 text files), but when I tried to click on a column header (I tried with all columns headers), I can't sort my datagridview data. :) 我有一个 datagridview,我用 List 填充它(我从 2 个文本文件中获取数据),但是当我尝试单击列标题(我尝试使用所有列标题)时,我无法对我的 datagridview 数据进行排序。 This is my code:这是我的代码:

 public class Data1
    {
        public string Campionato { get; set; }
        public string Data { get; set; }
        public string Home { get; set; }
        public string Away { get; set; }
        public int HSFT { get; set; }
        public int ASFT { get; set; }
        public int HSHT { get; set; }
        public int ASHT { get; set; }
        public int HSSH { get; set; }
        public int ASSH { get; set; }
    }

    public class Data2 
    {
        public string Home { get; set; }
        public string Away { get; set; }
        public int HSFT { get; set; }
        public int ASFT { get; set; }
        public string HODD { get; set; }
        public string XODD { get; set; }
        public string AODD { get; set; } //no name in sample
        public string Data { get; set; }
        public string RisFin { get; set; } //no name in sample
        public string Over05SH { get; set; }
        public string Over05HT { get; set; }
        public string Over15HT { get; set; }
        public string Over05FT { get; set; }
        public string Over15FT { get; set; }
        public string Over25FT { get; set; }
        public string Over35FT { get; set; }
        public string Over45FT { get; set; }



    }

    public class CombinedData 
    {
        public string Campionato { get; set; }
        public string Data { get; set; }
        public string Home { get; set; }
        public string Away { get; set; }
        public int HSFT { get; set; }
        public int ASFT { get; set; }
        public int HSHT { get; set; }
        public int ASHT { get; set; }
        public int HSSH { get; set; }
        public int ASSH { get; set; }
        public string HODD { get; set; }
        public string XODD { get; set; }
        public string AODD { get; set; } //some name
        public string RisFin { get; set; } //no name in sample
        public string Over05SH { get; set; }
        public string Over05HT { get; set; }
        public string Over15HT { get; set; }
        public string Over05FT { get; set; }
        public string Over15FT { get; set; }
        public string Over25FT { get; set; }
        public string Over35FT { get; set; }
        public string Over45FT { get; set; }

    }

var data1 = File.ReadAllLines("read" + campionatoselezTxt.Text + "stats.txt").ToList();
        var data2 = File.ReadAllLines("read" + campionatoselezTxt.Text + "bex.txt").ToList();


        var dataList1 = new List<Data1>();
        foreach (var data in data1)
        {
            var columns = data.Split(';'); 
            dataList1.Add(new Data1
            {
                Campionato = columns[0],
                Data = columns[1],
                Home = columns[2],
                Away = columns[3],

                HSFT = int.Parse(columns[4]),
                ASFT = int.Parse(columns[5]),
                HSHT = int.Parse(columns[6]),
                ASHT = int.Parse(columns[7]),
                HSSH = int.Parse(columns[8]),
                ASSH = int.Parse(columns[9])
                //other int properties
            });
        }

        var dataList2 = new List<Data2>();
        foreach (var data in data2)
        {
            var columns = data.Split(';'); 
            dataList2.Add(new Data2
            {
                Home = columns[0],
                Away = columns[1],
                HODD = columns[4],
                XODD = columns[5],
                AODD = columns[6],


            });
        }

        var combinedDataList = from d1 in dataList1 
                               //join d2 in dataList2 on d1.Home equals d2.Home
                               join d2 in dataList2 on new { d1.Home, d1.Away } equals new { d2.Home, d2.Away }

                               select new CombinedData
                               {
                                   Campionato = d1.Campionato,
                                   Data = d1.Data,
                                   Home = d2.Home,
                                   Away = d2.Away,
                                   HSFT = d1.HSFT,
                                   ASFT = d1.ASFT,
                                   HSHT = d1.HSHT,
                                   ASHT = d1.ASHT,
                                   HSSH = d1.HSSH,
                                   ASSH = d1.ASSH,
                                   HODD = d2.HODD,
                                   XODD = d2.XODD,
                                   AODD = d2.AODD,
                                   RisFin = d2.RisFin,
                                   Over05SH = d2.Over05SH

                               }; //map all properties

        finabexDgv.DataSource = combinedDataList.ToList(); 
        finabexDgv.AllowUserToOrderColumns = true;   

I'd like to have a possibility to sort by clicking columns headers.我希望可以通过单击列标题进行排序。

I need your advices, please :)我需要你的建议,请:)

Happy Sunday!快乐星期天!

On your desing view, search the "ColumnHeaderMouseClick" and double click on the empty field.在您的设计视图中,搜索“ColumnHeaderMouseClick”并双击空白字段。

on the new function, apply some code like this:在新函数上,应用一些这样的代码:

dgv_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
{
if (dgv.Columns[e.ColumnIndex].SortMode != DataGridViewColumnSortMode.NotSortable)
            {
                if (e.ColumnIndex == newSortColumn )
                {
                    if (newColumnDirection == ListSortDirection.Ascending)
                        newColumnDirection = ListSortDirection.Descending;
                    else
                        newColumnDirection = ListSortDirection.Ascending;
                }

                newSortColumn = e.ColumnIndex;

                switch (newColumnDirection)
                {
                    case ListSortDirection.Ascending:
                        dgv.Sort(dgv.Columns[newSortColumn], ListSortDirection.Ascending);
                        break;
                    case ListSortDirection.Descending:
                        dgv.Sort(dgv.Columns[newSortColumn], ListSortDirection.Descending);
                        break;
                }
            }
}

and at the top of the class, add two private variables:在类的顶部,添加两个私有变量:

int newSortColumn;
ListSortDirection newColumnDirection = ListSortDirection.Ascending;

This will work if you don't have anything else rare at your source code.如果您的源代码中没有其他稀有的东西,这将起作用。

Note: This code is not mine, i got it form here at stackoverflow注意:这段代码不是我的,我是在 stackoverflow 上得到的

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM