我有一个由DataGridView
as described by this article支持的SortableBindingList
。
这基本上是BindingList
,其数据源是自定义对象的列表。底层自定义对象以编程方式更新。
我的SortableBindingList
允许我按升序或降序对每列进行排序。我通过重载ApplySortCore
方法
protected override void ApplySortCore(PropertyDescriptor prop,
ListSortDirection direction)
这适用于在单击列标题时进行排序,但在以编程方式更新该列中的单元格时不会自动排序。
有没有其他人想出一个很好的解决方案来保持DataGridView
从其基础数据源的程序化更新中排序?
答案 0 :(得分:4)
尝试覆盖OnDataSourceChanged事件
public class MyGrid : DataGridView {
protected override void OnDataSourceChanged(EventArgs e)
{
base.OnDataSourceChanged(e);
MyComparer YourComparer = null;
this.Sort(YourComparer);
}
}
答案 1 :(得分:1)
考虑这个课程:
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
}
}
将这些方法添加到可排序的绑定列表中:
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
}
并在表单中使用此示例方法:
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++;
}