Benutzer mit den meisten Antworten
WPF DataGrid CanSort = true setzen

Frage
-
Hallo,
Ich habe ein DataGrid an ein ADO.Net Entity Data Model gebunden.
Die Daten im Grid lassen sich gruppieren, aber weder sortieren noch filtern.
Gibt es eine Möglichkeit die Daten wenigstens sortieren zu können?
Herzlichen Dank im Voraus für eine Antwort welche mir weiter hilft.
Gruß Carl-Heinz Robert
Antworten
-
Hallo Carl-Heinz,es freut mich, dass man in einem fortgeschrittenen Alter auch noch solch interessante Probleme lösen kann, insbesondere, da ich auch bald die 70 erreiche.Die Express-Versionen bieten Click-Once als alleinige Veröffentlichungstechnologie. Jedenfalls fehlen bei den Express-Versionen die Vorlagen für Setup-Projekte. Deshalb kann ich Deine Bemerkung zu Click-Once nicht nachvollziehen und verstehen.Auch kann ich mir nicht vorstellen, warum man sich die Unübersichtlichkeit der Klammern und Semikolons antun muss, wenn man eine blumenreiche, aussagekräftige Syntaxdarstellung mit BASIC nutzen kann : – ).--
Viele Gruesse
Peter- Als Antwort markiert Carl-Heinz Robert Sonntag, 17. Juni 2012 12:46
-
Hallo Peter,
Nein, nochmals herzlichen Dank.
Viele Gruesse
Carl-Heinz
- Als Antwort markiert Carl-Heinz Robert Mittwoch, 20. Juni 2012 05:50
Alle Antworten
-
Hi Karl-Heinz,vermutlich hast Du zum Binden keine Sicht genutzt. Wenn das so ist, dann wird die Sicht implizit erzeugt.Um zu filtern oder zu sortieren, benötigt man die Sicht. Entweder man holt sich die implizit erzeugte Sicht, oder man nimmt für die Bindung gleich eine Sicht oder ein Objekt, welches ICollectionView implementiert. Da kann man dann filtern und sortieren.--
Viele Gruesse
Peter -
Hi Peter
herzlichen Dank für die schnelle Antwort.
Der Code meiner Anwendung sieht an den betrffenden Stellen so aus:
.....
xmlns:scm="clr-namespace:System.ComponentModel;assembly=WindowsBase"
....
<Window.Resources>
<CollectionViewSource x:Key="kundenViewSource" d:DesignSource="{d:DesignInstance my:Kunden, CreateList=True}" >
<!--<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Name"/>
</CollectionViewSource.SortDescriptions>-->
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Adresse_Ort"/>
</CollectionViewSource.GroupDescriptions></CollectionViewSource>
....
</Window.Resources><Grid>
<TabControl Height="367" HorizontalAlignment="Left" Margin="0,29,0,0" Name="tabControl1" VerticalAlignment="Top" Width="863" >
<TabItem Header="Kunden" Name="tabItem1">
<StackPanel DataContext="{StaticResource kundenViewSource}">
<DataGrid AutoGenerateColumns="False" EnableRowVirtualization="True" Height="Auto" ItemsSource="{Binding}" Name="kundenDataGrid" RowDetailsVisibilityMode="VisibleWhenSelected" Width="Auto" HorizontalAlignment="Left">
<DataGrid.Columns>
<DataGridTextColumn x:Name="nameColumn" Binding="{Binding Path=Name}" Header="Name" Width="150" />
<DataGridTextColumn x:Name="vornameColumn" Binding="{Binding Path=Vorname}" Header="Vorname" Width="100" />
</DataGrid.Columns>
</DataGrid>
</StackPanel>
</TabItem>
.....
</TabControl>
</Grid>
</Window>
_______________________________________________________________________________________________________________________________________private void Window_Loaded(object sender, RoutedEventArgs e)
{TonisTortenTraum.TonisTortenTraumEntities TTTcontext = new TonisTortenTraum.TonisTortenTraumEntities();
kundenViewSource = ((System.Windows.Data.CollectionViewSource)(this.FindResource("kundenViewSource")));
System.Data.Objects.ObjectQuery<TonisTortenTraum.Kunden> kundenQuery = this.GetKundenQuery(TTTcontext);
kundenViewSource.Source = kundenQuery.Execute(System.Data.Objects.MergeOption.AppendOnly);ICollectionView kundenView = CollectionViewSource.GetDefaultView(kundenDataGrid.ItemsSource);
if (kundenView != null && kundenView.CanSort == true)
{
kundenView.SortDescriptions.Clear();
kundenView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));
kundenView.SortDescriptions.Add(new SortDescription("Vorname", ListSortDirection.Ascending));
}
}_________________________________________________________________________________________________________________________________________
Folgender Versuch:
ICollectionView kundenView = CollectionViewSource.GetDefaultView(kundenDataGrid.ItemsSource).CanSort=true;
wird mit der Meldung:
Fehler: Einer Eigenschaft oder einem Indexer "system.ComponentModel.ICollectionView.ConSort" kann nichts zugewiesen werden
-- sie sind schreibgeschützt.Frage: was kann ich noch tun bzw. haben Sie ein entsprechendes Code Beispiel?
Viele Grüße
Carl-Heinz -
-
Hi Caprio Francesco,
vielen Dank für den Link.
Leider bezieht sich das dortige Beispiel nur auf eine selbst gefüllte Listbox als Datenquelle.
Ich benötige aber ein Beipiel für ein, aus einer Datenbank erstelltem Entitäten Modell,
aus dem ich Daten in ein DataGrid übernehmen kann.
Übernehme ich z.B die Daten aus einer DataTable statt aus einem Entitätenmodell, kann ich sortieren und gruppieren aber nicht filtern.
Viele Grüsse
Carl-Heinz
-
Hi Carl-Heinz,das Ergebnis eines direkten Abrufes aus der Datenbank lässt sich nicht sortieren. Das ist beim EDM der Fall, wenn direkt aus der Datenbank ohne zu puffern gelesen wird.Du musst Dir vorstellen, dass der Abruf der Daten aus der Datenbank mit einem DataReader realisiert wird, der nur vorwärts lesen kann. Die Oberfläche holt sich jedes Mal, wenn sie Daten anzeigen will/muss die Daten direkt aus der Datenbank mit einem DataReader. Wenn Du da sortiert anzeigen willst, musst Du die orderby Anweisung in LinQ nutzen, damit der Datenbankserver die Datensätze sortiert liefert.Wenn Du die Sortiermöglichkeiten der Sicht nutzen willst, dann musst Du einen Puffer zwischenschalten, aus dem die Sicht sortiert die Daten bereitstellen kann, z.B. so mit einer ObservableCollection:
Imports System.ComponentModel Imports System.Collections.ObjectModel Public Class Window2 Private Sub Window_Loaded(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles MyBase.Loaded Me.DataContext = Me End Sub Dim cvs As New CollectionViewSource Public ReadOnly Property View As ICollectionView Get If cvs.View Is Nothing Then Dim TTTcontext As New TestEntities() cvs.Source = New ObservableCollection(Of Kunden)(TTTcontext.Tab1) With cvs.View.SortDescriptions .Add(New SortDescription("Name", ListSortDirection.Ascending)) .Add(New SortDescription("Vorname", ListSortDirection.Ascending)) End With End If Return cvs.View End Get End Property End Class
--
Viele Gruesse
Peter- Bearbeitet Peter Fleischer Samstag, 16. Juni 2012 16:36
- Als Antwort vorgeschlagen Peter Fleischer Samstag, 16. Juni 2012 16:36
-
Hi Carl-Heinz,kommst Du mit der B(eginner)ASIC-Sprache nicht zurecht?Ich habe Dir mal die geschweiften Klammern und Semikolons gesetzt:CollectionViewSource cvs = New CollectionViewSource();Public ICollectionView View{Get{If (cvs.View == null){TestEntities TTTcontext = New TestEntities();cvs.Source = New ObservableCollection<Kunden>(TTTcontext.Tab1);cvs.View.SortDescriptions.Add(New SortDescription("Name", ListSortDirection.Ascending));cvs.View.SortDescriptions.Add(New SortDescription("Vorname", ListSortDirection.Ascending));}Return cvs.View;}}--
Viele Gruesse
Peter -
Hi Peter
Danke für die Mühe,
natülich komme ich mit der B(eginner)ASIC-Sprache nicht zurecht:
Der Vorschlag mit der orderby Anweisung in LinQ funktioniert prächtig.
zu meinen Programmierkentnissen:
Ich bin 76 Jahre alt und habe mich, um nicht vor dem Fernseher völlig zu verblöden mit 70
in VB eingearbeitet, Beispiele aus dicken Büchern abgearbeitet und für einen Freund eine eintabellige SQL Datenbankanwendung
zur Verwaltung seiner Musiktitel geschrieben.
Danach folgte in C++ eine Stromverteilung auf Flächenwiderständen mit graphischer Aufbereitung.
als ich dieses Programm fertig hatte stellte ich leider fest, das ich mit EXPRESS Version keine Click-Once Veröffentlichung habe.
Daraufhin habe ich die Anwendung auf C# umgestellt.
z.Z. befasse ich mich mit ADO.NET Entity Framework.
In meinem Alter ist das leider mit dem Merken des Erlernten so eine Sache,
damit bin ich auf das kopieren und anpassen von Code Teilen angewiesen.
viele Grüsse
Carl-Heinz
- Bearbeitet Carl-Heinz Robert Sonntag, 17. Juni 2012 09:57
-
Hallo Carl-Heinz,es freut mich, dass man in einem fortgeschrittenen Alter auch noch solch interessante Probleme lösen kann, insbesondere, da ich auch bald die 70 erreiche.Die Express-Versionen bieten Click-Once als alleinige Veröffentlichungstechnologie. Jedenfalls fehlen bei den Express-Versionen die Vorlagen für Setup-Projekte. Deshalb kann ich Deine Bemerkung zu Click-Once nicht nachvollziehen und verstehen.Auch kann ich mir nicht vorstellen, warum man sich die Unübersichtlichkeit der Klammern und Semikolons antun muss, wenn man eine blumenreiche, aussagekräftige Syntaxdarstellung mit BASIC nutzen kann : – ).--
Viele Gruesse
Peter- Als Antwort markiert Carl-Heinz Robert Sonntag, 17. Juni 2012 12:46
-
Hallo Peter,
ältere Herrschaften arbeiten auch sonntags, das ist schön.
Für C++ Express hatte ich keine Click Once gefunden, für alle anderen EXPRESS schon.
Möglicherweise habe ich die falschen Sprachen geübt, BASIC war leider nicht dabei.
Mit den Klammern und Semikolons gebe ich Dir recht.
Viele Gruesse
Carl-Heinz- Bearbeitet Carl-Heinz Robert Sonntag, 17. Juni 2012 13:27
-
-
Hallo Peter,
Nein, nochmals herzlichen Dank.
Viele Gruesse
Carl-Heinz
- Als Antwort markiert Carl-Heinz Robert Mittwoch, 20. Juni 2012 05:50