2012-04-27 6 views
5

He implementado la clase SortableSearchableList encontrado en http://msdn.microsoft.com/en-us/library/aa480736.aspx y he añadido un método de ordenación de la siguiente manera:Sortable BindingList obligado a DataGridView con una especie programática

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

Esta clase funciona al ordenar mi DataGridView haciendo clic en cualquiera de los encabezados de columna, pero necesito poder llamar programáticamente el método Sort para una columna específica (usando un control sortButton en este ejemplo). Los pocos ejemplos de código que he encontrado en línea sugieren obtener el PropertyDescriptor para la columna y pasarlo junto con el método ApplySortCore. Todavía tengo que hacer que eso funcione. Puedo obtener las propiedades PropertyDescriptorCollection de mi DataGridView u SortableSearchableList, pero parece que no puedo obtener el método Find para obtener PropertyDescriptor para mi columna/miembro especificado. Aquí está el resto de mi código:

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

Cualquier ayuda sería muy apreciada.

Respuesta

5

Prueba este

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

Gracias, que funciona! –

Cuestiones relacionadas