Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# DataGridView sorting with Generic List as underlying source

Tags:

I'm using a Windows Forms DataGridView to display a generic list of MyObject objects.

First of all I wrap this collection into a BindingSource Collection, then:

dataGridView.DataSource = myBindingSource; 

What I want to do is allow the user to sort the columns by clickin on the header of the column representing a concrete Property in MyObject.

I've read some articles that I should do sorting before binding. But it does not help me if I want to sort the columns in real time, being said when it's already binded.

The question is, what exactly do I need to do, so I could see the sorting arrows in DataGridView and I could sort every column ?

like image 983
theSpyCry Avatar asked Sep 04 '09 06:09

theSpyCry


1 Answers

Complete code to sort the column of datagridview whose datasource is a generic List

//----------------------------------------------------------------------------------------- //In the form - In constructor or form load, populate the grid. //--------------------------------------------------------------------------------------------      List<student> students;      private void PopulateList()     {         student std1 = new student("sss", 15, "Female");         student std2 = new student("ddd", 12, "Male");         student std3 = new student("zzz", 16, "Male");         student std4 = new student("qqq", 14, "Female");         student std5 = new student("aaa", 11, "Male");         student std6 = new student("lll", 13, "Female");          students = new List<student>();         students.Add(std1);         students.Add(std2);         students.Add(std3);         students.Add(std4);         students.Add(std5);         students.Add(std6);          dataGridView1.DataSource = students;     }   //--------------------------------------------------------------------------------------------- //Comparer class to perform sorting based on column name and sort order //---------------------------------------------------------------------------------------------   class StudentComparer : IComparer<Student> {     string memberName = string.Empty; // specifies the member name to be sorted     SortOrder sortOrder = SortOrder.None; // Specifies the SortOrder.      /// <summary>     /// constructor to set the sort column and sort order.     /// </summary>     /// <param name="strMemberName"></param>     /// <param name="sortingOrder"></param>     public StudentComparer(string strMemberName, SortOrder sortingOrder)     {         memberName = strMemberName;         sortOrder = sortingOrder;     }      /// <summary>     /// Compares two Students based on member name and sort order     /// and return the result.     /// </summary>     /// <param name="Student1"></param>     /// <param name="Student2"></param>     /// <returns></returns>     public int Compare(Student Student1, Student Student2)     {         int returnValue = 1;         switch (memberName)         {             case "Name" :                 if (sortOrder == SortOrder.Ascending)                 {                     returnValue = Student1.Name.CompareTo(Student2.Name);                 }                 else                 {                     returnValue = Student2.Name.CompareTo(Student1.Name);                 }                  break;             case "Sex":                 if (sortOrder == SortOrder.Ascending)                 {                     returnValue = Student1.Sex.CompareTo(Student2.Sex);                 }                 else                 {                     returnValue = Student2.Sex.CompareTo(Student1.Sex);                 }                 break;             default:                 if (sortOrder == SortOrder.Ascending)                 {                     returnValue = Student1.Name.CompareTo(Student2.Name);                 }                 else                 {                     returnValue = Student2.Name.CompareTo(Student1.StudentId);                 }                 break;         }         return returnValue;     } }    //--------------------------------------------------------------------------------------------- // Performing sort on click on Column Header //---------------------------------------------------------------------------------------------      private void dataGridView1_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)     {         //get the current column details         string strColumnName = dataGridView1.Columns[e.ColumnIndex].Name;         SortOrder strSortOrder = getSortOrder(e.ColumnIndex);          students.Sort(new StudentComparer(strColumnName, strSortOrder));         dataGridView1.DataSource = null;         dataGridView1.DataSource = students;         customizeDataGridView();         dataGridView1.Columns[e.ColumnIndex].HeaderCell.SortGlyphDirection = strSortOrder;     }     /// <summary>     /// Get the current sort order of the column and return it     /// set the new SortOrder to the columns.     /// </summary>     /// <param name="columnIndex"></param>     /// <returns>SortOrder of the current column</returns>     private SortOrder getSortOrder(int columnIndex)     {         if (dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection == SortOrder.None ||             dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection == SortOrder.Descending)         {             dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection = SortOrder.Ascending;             return SortOrder.Ascending;         }         else         {             dataGridView1.Columns[columnIndex].HeaderCell.SortGlyphDirection = SortOrder.Descending;             return SortOrder.Descending;         }     } 
like image 116
Asish Avatar answered Oct 03 '22 00:10

Asish