使用编程排序绑定到DataGridView的可排序BindingList

我已经在http://msdn.microsoft.com/en-us/library/aa480736.aspx上实现了SortableSearchableList类,并为它添加了一个Sort方法,如下所示:

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

这个类在通过单击任何列标题对DataGridView进行排序时起作用,但是我需要能够以编程方式调用指定列的Sort方法(在本例中使用sortButton控件)。 我在网上找到的几个代码示例建议获取列的PropertyDescriptor并将其传递给ApplySortCore方法。 我还没有那个工作。 我可以获取DataGridView或SortableSearchableList的PropertyDescriptorCollection属性,但似乎无法获取Find方法来获取指定列/成员的PropertyDescriptor。 这是我的其余代码:

 namespace SortableBindingListTest { public partial class Form1 : Form { private SortableSearchableList alarms = new SortableSearchableList(); 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)); } } } 

任何帮助将不胜感激。

试试这个

 dataGridView1.Sort(dataGridView.Columns[0],ListSortDirection.Ascending);