Saving Autostart DataGridView

I have a DataGridView that is supported by a SortableBindingList as described in this article .

This is essentially a BindingList whose data source is a list of user objects. Key user objects are updated programmatically.

My SortableBindingList allows SortableBindingList to sort each column in ascending or descending order. I did this by overloading the ApplySortCore method

 protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) 

This works well for sorting by clicking on a column heading, but will not automatically sort when a cell in that column is updated programmatically.

Has anyone else come up with a good solution for storing a DataGridView sorted by software updates of its underlying data source?

+8
c # datagridview bindingsource
source share
2 answers

Consider this class:

 public class MyClass : INotifyPropertyChanged { private int _id; private string _value; public int Id { get { return _id; } set { PropertyChanged(this, new PropertyChangedEventArgs("Id")); _id = value; } } public string Value { get { return _value; } set { PropertyChanged(this, new PropertyChangedEventArgs("Value")); _value = value; } } public event PropertyChangedEventHandler PropertyChanged = new PropertyChangedEventHandler(OnPropertyChanged); private static void OnPropertyChanged(object sender, PropertyChangedEventArgs e) { // optional code logic } } 

Add these methods to the list of sortable bindings:

 public class SortableBindingList<T> : BindingList<T>, INotifyPropertyChanged where T : class { public void Add(INotifyPropertyChanged item) { item.PropertyChanged += item_PropertyChanged; base.Add((T)item); } void item_PropertyChanged(object sender, PropertyChangedEventArgs e) { this.PropertyChanged(sender, new PropertyChangedEventArgs(String.Format("{0}:{1}", sender, e))); } // other content in the method body } 

And use these sample methods in your form:

 public Form1() { InitializeComponent(); source = new SortableBindingList<MyClass>(); source.Add(new MyClass() { Id = 1, Value = "one test" }); source.Add(new MyClass() { Id = 2, Value = "second test" }); source.Add(new MyClass() { Id = 3, Value = "another test" }); source.PropertyChanged += source_PropertyChanged; dataGridView1.DataSource = source; } void source_PropertyChanged(object sender, PropertyChangedEventArgs e) { MessageBox.Show(e.PropertyName); dataGridView1.DataSource = source; } private void button1_Click(object sender, EventArgs e) { ((MyClass)source[0]).Id++; } 
+1
source share

Try overriding the OnDataSourceChanged event

 public class MyGrid : DataGridView { protected override void OnDataSourceChanged(EventArgs e) { base.OnDataSourceChanged(e); MyComparer YourComparer = null; this.Sort(YourComparer); } } 
+4
source share

All Articles