2012-04-27 25 views
5

tôi đã triển khai lớp SortableSearchableList tìm thấy tại http://msdn.microsoft.com/en-us/library/aa480736.aspx và đã thêm một Sắp xếp phương pháp để nó như sau:Sortable BindingList ràng buộc để DataGridView với loại chương trình

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

lớp này hoạt động khi sắp xếp DataGridView của tôi bằng cách nhấp vào bất kỳ các tiêu đề cột, nhưng tôi cần để có thể lập trình gọi phương thức Sort cho một cột được chỉ định (sử dụng một điều khiển sortButton trong ví dụ này). Một vài ví dụ mã tôi đã tìm thấy trực tuyến đề nghị lấy PropertyDescriptor cho cột và chuyển nó sang phương thức ApplySortCore. Tôi vẫn chưa làm được điều đó. Tôi có thể nhận được các thuộc tính PropertyDescriptorCollection của DataGridView hoặc SortableSearchableList của tôi, nhưng dường như không thể có được phương thức Find để lấy PropertyDescriptor cho cột/thành viên được chỉ định của tôi. Đây là phần còn lại của mã của tôi:

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)); 
    } 
} 
} 

Mọi trợ giúp sẽ được đánh giá cao.

Trả lời

5

Hãy thử

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

Cảm ơn này, mà làm việc! –

Các vấn đề liên quan