Intereting Posts
C # Form1.cs больше не отображается в обозревателе решений Параметр WebAPI 404, когда в URL-адресе есть конечное пространство Как мне взаимодействовать между ViewModels? XmlSerializer изменение кодировки Получение неактивности / простоя в приложении WPF В C #, являются ли типы значений изменчивыми или неизменяемыми? Ping.SendAsync () вернул воспроизведение с 0.0.0.0, как получить пинговый адрес? Сервисы Ria Передача сложного объекта в качестве параметра метода службы домена запроса Как написать регулярное выражение, которое допускает только буквы, цифры и специальные символы только в середине никогда в конце Самый быстрый способ конвертировать байт ascii с номером с нулевым завершением в строку? Как разбить строку в List из многострочного TextBox, который добавляет ‘\ n \ r’ в качестве окончаний строки? Как сделать файл «Только для чтения»? Ограничения в Mono для .NET-разработчика. Унаследованные свойства не отображаются в образце мыла в файле asmx Связывание WPF ObservableCollection с конвертером

Использование SortableBindingList – DataGridView не сортирует автоматически изменения

Я создаю приложение Windows Forms, которое отображает пользовательский class. Record объекты и сортирует их по тому, как долго они были в моем SortableBindingList record_list . Когда я запускаю свою программу, у меня есть некоторые «фиктивные» записи, загруженные в этот список уже для тестирования.

SortableBindingList взята отсюда .

 public partial class Form1 : Form { public SortableBindingList record_list = new SortableBindingList { }; public static DataGridViewCellStyle style = new DataGridViewCellStyle(); public Form1() { InitializeComponent(); dataGridView.DataSource = record_list; FillData(); //Temporary function to insert dummy data for demo. dataGridView.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.cell_formatting); this.Controls.Add(dataGridView); this.dataGridView.RowHeadersVisible = false; this.dataGridView.Sort(this.dataGridView.Columns["UserName"], ListSortDirection.Ascending); start_timer(); } 

Результат перед добавлением «новых» данных (примечание: это было в алфавитном порядке автоматически, в частности, введено в список из алфавитного порядка):

введите описание изображения здесь

Результат после добавления данных:

введите описание изображения здесь

Наконец, результат после нажатия на заголовок «UserName»:

введите описание изображения здесь

Итак, нужно ли принудительно сортировать каждый раз, когда обновляется DataSource? Если это так, как я называю сортировку таким образом?

Благодарим вас за помощь!

При изменении списка необходимо применить сортировку.

SortableBindingList нуждается в некоторых изменениях, чтобы сохранить список отсортированным, когда некоторые изменения внесены в список. Вот полный код с изменениями, которые я сделал.

Обратите внимание. Метод OnListChanged BindingList будет вызываться автоматически после добавления и удаления элементов. Но если вам нужно, чтобы OnListChanged также OnListChanged после изменения свойств элементов, вы должны реализовать INotifyPropertyChanged для вашего classа модели.

 using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; public class SortableBindingList : BindingList { private bool isSortedValue; ListSortDirection sortDirectionValue; PropertyDescriptor sortPropertyValue; public SortableBindingList() : base() { } public SortableBindingList(IList list) : base(list) { } protected override void ApplySortCore(PropertyDescriptor prop, ListSortDirection direction) { Type interfaceType = prop.PropertyType.GetInterface("IComparable"); if (interfaceType == null && prop.PropertyType.IsValueType) { Type underlyingType = Nullable.GetUnderlyingType(prop.PropertyType); if (underlyingType != null) { interfaceType = underlyingType.GetInterface("IComparable"); } } if (interfaceType != null) { sortPropertyValue = prop; sortDirectionValue = direction; IEnumerable query = base.Items; if (direction == ListSortDirection.Ascending) query = query.OrderBy(i => prop.GetValue(i)); else query = query.OrderByDescending(i => prop.GetValue(i)); int newIndex = 0; foreach (object item in query) { this.Items[newIndex] = (T)item; newIndex++; } isSortedValue = true; sorting = true; this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1)); sorting = false; } else { throw new NotSupportedException("Cannot sort by " + prop.Name + ". This" + prop.PropertyType.ToString() + " does not implement IComparable"); } } bool sorting = false; protected override PropertyDescriptor SortPropertyCore { get { return sortPropertyValue; } } protected override ListSortDirection SortDirectionCore { get { return sortDirectionValue; } } protected override bool SupportsSortingCore { get { return true; } } protected override bool IsSortedCore { get { return isSortedValue; } } protected override void RemoveSortCore() { isSortedValue = false; sortPropertyValue = null; } protected override void OnListChanged(ListChangedEventArgs e) { if (!sorting && sortPropertyValue != null) ApplySortCore(sortPropertyValue, sortDirectionValue); else base.OnListChanged(e); } }