title: Sortable BindingList bound to DataGridView with programmatic sort
body: <p>I have implemented the SortableSearchableList class found at <a href="http://msdn.microsoft.com/en-us/library/aa480736.aspx">http://msdn.microsoft.com/en-us/library/aa480736.aspx</a> and have added a Sort method to it as follows:</p>
  
  <pre><code>public void Sort(PropertyDescriptor prop, ListSortDirection direction)
  {
  ApplySortCore(prop, direction);
  }
  </code></pre>
  
  <p>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:</p>
  
  <pre><code>namespace SortableBindingListTest
  {
  public partial class Form1 : Form
  {
      private SortableSearchableList&lt;Tags&gt; alarms = new SortableSearchableList&lt;Tags&gt;();
      public Form1()
      {
          InitializeComponent();
          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.Columns.Add(alarmColumn);
          dataGridView1.Columns.Add(messageColumn);
          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; }
          set
          {
              _alarm = value;
              this.NotifyPropertyChanged("Alarm");
          }
      }
      public string Message
      {
          get { return _message; }
          set
          {
              _message = value;
              this.NotifyPropertyChanged("Message");
          }
      }
      private void NotifyPropertyChanged(string name)
      {
          if (PropertyChanged != null)
              PropertyChanged(this, new PropertyChangedEventArgs(name));
      }
  }
  }
  </code></pre>
  
  <p>Any help would be greatly appreciated.</p>