none
WPF DataGrid CanSort = true setzen RRS feed

  • 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

    Sonntag, 10. Juni 2012 17:37

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
    Sonntag, 17. Juni 2012 12:05
  • Hallo Peter,

    Nein, nochmals herzlichen Dank.

     Viele Gruesse

    Carl-Heinz

    Sonntag, 17. Juni 2012 18:00

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
    Sonntag, 10. Juni 2012 20:45
  • 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

    Montag, 11. Juni 2012 07:28
  • 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

    Samstag, 16. Juni 2012 14:41
  • 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


    Samstag, 16. Juni 2012 16:34
  • Hi Peter,

    danke für die schnelle Antwort.

    Frage hast du den Vorschlag auch in C# ?

    viele Güsse

    Carl-Heinz

    Samstag, 16. Juni 2012 17:55
  • 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
    Samstag, 16. Juni 2012 19:04
  • 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


    Sonntag, 17. Juni 2012 09:11
  • 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
    Sonntag, 17. Juni 2012 12:05
  • 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


    Sonntag, 17. Juni 2012 13:02
  • Hallo Calr-Heinz,
    ältere Herrschaften haben das Privileg, dass sie außer in den Zeiten der Betreuung der Enkel und ggf. Urenkel, sich genügend Zeit für Hobbys nehmen können.
     
    Hast Du noch Fragen zum eigentlichen Problem?
     
    --
    Viele Gruesse
    Peter
    Sonntag, 17. Juni 2012 14:24
  • Hallo Peter,

    Nein, nochmals herzlichen Dank.

     Viele Gruesse

    Carl-Heinz

    Sonntag, 17. Juni 2012 18:00