C# – Sortable BindingList bound to DataGridView with programmatic sort


I have implemented the SortableSearchableList class found at http://msdn.microsoft.com/en-us/library/aa480736.aspx and have added a Sort method to it as follows:

public void Sort(PropertyDescriptor prop, ListSortDirection direction)
ApplySortCore(prop, direction);

This class works when sorting my DataGridView by clicking on any of the column headers, but I need to be able to programmatically call the Sort method for a specified column (using a sortButton control in this example). The few code examples I've found online suggest obtaining the PropertyDescriptor for the column and passing it along to the ApplySortCore method. I have yet to get that to work. I can get the PropertyDescriptorCollection properties of either my DataGridView or SortableSearchableList, but can't seem to get the Find method to obtain the PropertyDescriptor for my specified column/member. Here's the rest of my code:

namespace SortableBindingListTest
public partial class Form1 : Form
    private SortableSearchableList<Tags> alarms = new SortableSearchableList<Tags>();
    public Form1()
        alarms.Add(new Tags("some text", "1"));
        alarms.Add(new Tags("more text", "2"));
        alarms.Add(new Tags("another one", "3"));
        dataGridView1.AutoGenerateColumns = false;
        dataGridView1.AllowUserToAddRows = true;
        dataGridView1.EditMode = DataGridViewEditMode.EditOnEnter;
        dataGridView1.RowHeadersVisible = false;
        dataGridView1.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
        DataGridViewTextBoxColumn alarmColumn = new DataGridViewTextBoxColumn();
        alarmColumn.DataPropertyName = "Alarm";
        alarmColumn.Name = "Alarm";
        alarmColumn.HeaderText = "Alarm";
        DataGridViewTextBoxColumn messageColumn = new DataGridViewTextBoxColumn();
        messageColumn.DataPropertyName = "Message";
        messageColumn.Name = "Message";
        messageColumn.HeaderText = "Message";
        dataGridView1.DataSource = alarms;

    private void sortButton_Click(object sender, EventArgs e)
        // try getting properties of BindingList
        PropertyDescriptorCollection listProperties = TypeDescriptor.GetProperties(alarms);
        PropertyDescriptor alarmProp = listProperties.Find("Alarm", false);
        // prop is null at this point, so the next line fails
        alarms.Sort(alarmProp, ListSortDirection.Ascending);
        // try getting properties of DataGridView column
        PropertyDescriptorCollection dgvProperties = TypeDescriptor.GetProperties(dataGridView1);
        PropertyDescriptor columnProp = dgvProperties.Find("Alarm", false);
        // columnProp is null at this point, so the next line also fails
        alarms.Sort(columnProp, ListSortDirection.Ascending);

public class Tags : INotifyPropertyChanged
    private string _alarm;
    private string _message;
    public event PropertyChangedEventHandler PropertyChanged;
    public Tags(string alarm, string message)
        _alarm = alarm;
        _message = message;

    public string Alarm
        get { return _alarm; }
            _alarm = value;
    public string Message
        get { return _message; }
            _message = value;
    private void NotifyPropertyChanged(string name)
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(name));

Any help would be greatly appreciated.

Best Solution

Try this

Related Question