Hi.
Ich habe zurzeit mein DGV mit einer SortableBindingList ausgestattet. Die normale BindingList lässt keine Sortierung im DGV zu.
Den Code hierfür habe ich im Netz gefunden:
public class SortableBindingList<T> : BindingList<T>,IBindingListView
{
private bool _isSorted;
protected override bool SupportsSortingCore
{
get { return true; }
}
protected override void ApplySortCore(PropertyDescriptor property, ListSortDirection direction)
{
// Get list to sort
List<T> items = this.Items as List<T>;
// Apply and set the sort, if items to sort
if (items != null)
{
PropertyComparer<T> pc = new PropertyComparer<T>(property, direction);
items.Sort(pc);
_isSorted = true;
}
else
{
_isSorted = false;
}
// Let bound controls know they should refresh their views
this.OnListChanged(new ListChangedEventArgs(ListChangedType.Reset, -1));
}
protected override bool IsSortedCore
{
get { return _isSorted; }
}
protected override void RemoveSortCore()
{
_isSorted = false;
}
Nun kann mein Nutzer bereits über das DGV die einzelnen Properties sortieren.
Nun möchte ich diese Liste gerne noch mit Filterfunktionalität ausstatten, damit nur noch bestimmte Objekte in meinem DGV angzeigt werden, wenn er eine Eingabe macht.
Kann mir jemand erklären, wie ich vorzugehen haben? Das Interface IBindingListView habe ich bereits eingebunden.
MfG
Hallo Bunnychecker,
wie hast du denn deine GUI architekturmäßig aufgebaut? Nach MVP, ö.ä.? Das wäre für sowas nämlich ratsam. Dadurch könntest du das Filtern und Sortieren aus der UI und der BindingsList komplett raushalten und im Presenter unterbringen. Dort gehört es mMn auch hin, da es über die "Standardsortierung" hinaus geht und Logik beinhaltet. Auch erreichst du so eine saubere Trennung der Anliegen und der Code wird testbar.
Ich gehe jetzt davon aus dass auch die BindingList von Winform mit einer ObservableCollection<T> umgehen kann und somit kann auf deren Items die Filt- und Sortierung vorgenommen werden.
mfG Gü
Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.
"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"
Nein, leider keine MVP, handelt sich auch nur um ein kleines Projekt. Was schlägst du in diesem Fall vor?
Hi,
IBindingListView ist ein guter Startpunkt.
Letztlich schreibt die Schnittstelle vor, dass wenn du
einen Filterstring entgegen nimmst du die items filtern
sollst -> einige Objekte aus der Collection (temporär) entfernst.
Das schwierige ist hauptsächlich das Parsen des Filterstrings in
anwendbare Filterbedingungen. Ich arbeite derzeit an sowas - je nachdem
was du alles unterstützen möchtest wird das alles andere als trivial... 😉
Fertige Implementierungen dafür gibt's im Web soweit ich weiß garnicht.
Das Beste was ich dazu kenne ist die BindingListView,
welche Filterung per Delegaten erlaubt.
Bitte immer beachten: Das erlaubt dann zwar alles Filtern - der DGV hat dennoch keine eingebaute Oberfläche zum Filtern...
Kann nur viel Spaß wünschen 😉
Ich werde mich jedenfalls melden, wenn meine Komponente fertig ist -
wird aber nicht in 1-2 Wochen sein 😛
LG
Achim