2017-04-23 58 views
1

我有一个DataSourceView绑定到BindingList的DataGridView。结果表看起来像这样。按行标题排序绑定到BindingList的DataGridView

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

什么是最简单的方法来使它,当我点击行标题,表按它排序?

+1

[检查这个](http://stackoverflow.com/questions/5553100/how-to-enable-datagridview-sorting-when-user-clicks-on-the-列标题) – user688

回答

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; } 
} 
相关问题