2012-04-27 94 views
5

我已经实现在http://msdn.microsoft.com/en-us/library/aa480736.aspx发现SortableSearchableList类,并增加了一个排序方法,如下所示:可排序的BindingList必然的DataGridView与方案排序

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

通过点击任何的排序我的DataGridView当这个类的工作列标题,但我需要能够以编程方式调用用于指定列的排序方法(使用在该实例中sortButton控制)。我在网上找到的一些代码示例建议获得列的PropertyDescriptor的,并且在传递到ApplySortCore方法。我还没有得到那个工作。我可以得到我的任何或者的DataGridView的SortableSearchableList的PropertyDescriptorCollection性质,但似乎无法得到Find方法获得的PropertyDescriptor为我指定的列/成员。这里是我的代码的其余部分:

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

任何帮助将不胜感激。

回答

5

试试这个

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

谢谢,这作品! – 2012-04-30 14:09:57