【问题标题】:Sort DataGridView bound to BindingList by row header按行标题对绑定到 BindingList 的 DataGridView 进行排序
【发布时间】:2017-09-20 12:28:45
【问题描述】:

我有一个 DataGridView,它的 DataSource 绑定到一个 BindingList。结果表如下所示。

Row Header    Property 1    Property 2    Property 3
----          ----          ----          ----
----          ----          ----          ----

什么是最简单的方法,以便当我单击行标题时,表格按它排序?

【问题讨论】:

标签: c# winforms datagridview


【解决方案1】:

您必须使用ColumnHeaderMouseClick 事件和DataGridViewColumn.HeaderCell.SortGlyphDirection 对以通用列表作为数据源的DataGridView 进行排序。

示例代码是

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        Person p = new Person { Birthday = new DateTime(2006, 12, 21), FirstName = "Jane", LastName = "Smith" };
        Person p2 = new Person { Birthday = new DateTime(2007, 9, 11), FirstName = "Alice", LastName = "Doe" };
        lstPeople.Add(p);
        lstPeople.Add(p2);
        dgvPeople.DataSource = lstPeople;
        foreach (DataGridViewColumn col in dgvPeople.Columns)
        {
            col.SortMode = DataGridViewColumnSortMode.Programmatic;
        }
    }
    public List<Person> lstPeople = new List<Person>();
    /// <summary>
    /// Sort the DataGridView when Header Column is clicked
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void dgvPeople_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        DataGridView grid = (DataGridView)sender;
        SortOrder so = SortOrder.None;
        if (grid.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection == SortOrder.None ||
            grid.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection == SortOrder.Ascending)
        {
            so = SortOrder.Descending;
        }
        else
        {
            so = SortOrder.Ascending;
        }
        //set SortGlyphDirection after databinding otherwise will always be none 
        Sort(grid.Columns[e.ColumnIndex].Name, so);
        grid.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = so; 
    }
    /// <summary>
    /// Sort the DataGridView
    /// </summary>
    /// <param name="column"></param>
    /// <param name="sortOrder"></param>
    private void Sort(string column, SortOrder sortOrder)
    {
        switch (column)
        {
            case "FirstName":
                {
                    if (sortOrder == SortOrder.Ascending)
                    {
                        dgvPeople.DataSource = lstPeople.OrderBy(x => x.FirstName).ToList();
                    }
                    else
                    {
                        dgvPeople.DataSource = lstPeople.OrderByDescending(x => x.FirstName).ToList();
                    }
                    break;
                }
            case "LastName":
                {
                    if (sortOrder == SortOrder.Ascending)
                    {
                        dgvPeople.DataSource = lstPeople.OrderBy(x => x.LastName).ToList();
                    }
                    else
                    {
                        dgvPeople.DataSource = lstPeople.OrderByDescending(x => x.LastName).ToList();
                    }
                    break;
                }
            case "Birthday":
                {
                    if (sortOrder == SortOrder.Ascending)
                    {
                        dgvPeople.DataSource = lstPeople.OrderBy(x => x.Birthday).ToList();
                    }
                    else
                    {
                        dgvPeople.DataSource = lstPeople.OrderByDescending(x => x.Birthday).ToList();
                    }
                    break;
                }
        }

    }
}
public class Person
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime Birthday { get; set; }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2017-02-22
    • 2012-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多