IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

DataGrid WPF Toolkit, Grosse consommation de mémoire


Sujet :

Windows Presentation Foundation

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Points : 307
    Points
    307
    Par défaut DataGrid WPF Toolkit, Grosse consommation de mémoire
    Bonjour à tous,

    Je viens donc ici pour savoir si d'autres avant moi ont rencontré ce problème.

    J'utilise donc le DataGrid officiel de Microsoft qui est fourni par WPF Toolkit.
    J'ai remarqué que le datagrid consommait énormément de mémoire lorsque l'on décidait de ne pas utiliser la génération automatique des colonnes. Pour ma part, j'utilise un certain nombre de DataGridTemplateColumn (qui sont généralement composés d'une image et d'un label) et de simples DataGridTextColumn

    Le problème est que mon datagrid reçoit environ 1000 entrées et qu'il prend beaucoup de temps pour afficher le rendu (Sur quelques centaines, le temps pris reste raisonnable). S'ajoute à cela une énorme consommation de mémoire, qui atteint chez moi 500Mo une fois fini.

    Etrangement, lorsque je le laisse générer automatiquement les colonnes, il ne prend que 0,5 seconde pour en faire le rendu et ne consomme "que" 50Mo (J'utilise également la RibbonControlLibrary et beaucoup d'icones). Bien évidement, le datagrid est beaucoup moins sexy comme ça

    A noter que j'ai, pour essayer, mis que des DataGridTextColumn (qui ne sont que des TextBlock dans une DataGridCell) avec la génération automatique des colonnes désactivée, le résultat est le même. C'est à dire une énorme consommation de mémoire et beaucoup de temps pour terminer le rendu

    Ces symptômes se retrouvent sur plusieures machines différentes.

    Je m'en remet donc à vous car après beaucoup de temps de recherche sur google principalement, je n'ai trouvé aucun indice.

    Merci d'avance pour votre aide

    Ps: Je suis disposé à poster du code si besoin

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Je veux bien du code montrant les 2 situations car je suis assez surpris des chiffres que tu annonces....

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Merci pour ta réponse, je t'assure que je suis aussi surpris

    Voici le code du DataGrid en question

    Voici la version avec la génération automatique désactivée
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
    <toolkit:DataGrid LostFocus="testing_LostFocus"  x:Uid="testing" ItemsSource="{Binding ElementName=Window, Path=CallCollection}" Name="testing" Margin="1" AlternationCount="2" AutoGenerateColumns="False" ScrollViewer.IsDeferredScrollingEnabled="True" ScrollViewer.CanContentScroll="False" EnableColumnVirtualization="True" Visibility="Collapsed" EnableRowVirtualization="True" HorizontalContentAlignment="Center" IsReadOnly="True" SnapsToDevicePixels="True" ClipToBounds="True" MinColumnWidth="20" RowHeight="40">
     
                                <toolkit:DataGrid.Columns>
                                    <toolkit:DataGridTemplateColumn x:Uid="toolkit:DataGridTemplateColumn_1" Header="Action" CanUserSort="True">
     
                                        <toolkit:DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate x:Uid="DataTemplate_10">
                                                <DockPanel LastChildFill="False">
                                                    <Label  DockPanel.Dock="Bottom" HorizontalAlignment="Center" FontSize="10" Content="{Binding ActionLabel}"></Label>
                                                    <Image DockPanel.Dock="Top" x:Uid="Image_2" Source="{Binding ActionImage}" Stretch="Uniform" />
                                                </DockPanel>
                                            </DataTemplate>
                                        </toolkit:DataGridTemplateColumn.CellTemplate>
                                    </toolkit:DataGridTemplateColumn>
     
                                    <toolkit:DataGridTemplateColumn x:Uid="toolkit:DataGridTemplateColumn_1" Header="Etat" CanUserSort="True">
     
                                        <toolkit:DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate x:Uid="DataTemplate_6">
                                                <DockPanel LastChildFill="False">
                                                    <Label DockPanel.Dock="Bottom" HorizontalAlignment="Center" FontSize="10" Content="{Binding StateLabel}"></Label>
                                                    <Image DockPanel.Dock="Top" x:Uid="Image_1" Source="{Binding State}" Stretch="Uniform"/>
                                                </DockPanel>
                                            </DataTemplate>
                                        </toolkit:DataGridTemplateColumn.CellTemplate>
                                    </toolkit:DataGridTemplateColumn>
     
                                    <toolkit:DataGridTemplateColumn x:Uid="toolkit:DataGridTemplateColumn_1" Header="Type" CanUserSort="True">
     
                                        <toolkit:DataGridTemplateColumn.CellTemplate>
                                            <DataTemplate x:Uid="DataTemplate_6">
                                                <DockPanel LastChildFill="False">
                                                    <Label DockPanel.Dock="Bottom" HorizontalAlignment="Center" FontSize="10" Content="{Binding TypeLabel}"></Label>
                                                    <Image DockPanel.Dock="Top" x:Uid="Image_1" Source="{Binding TypeImage}" Stretch="Uniform"/>
                                                </DockPanel>
                                            </DataTemplate>
                                        </toolkit:DataGridTemplateColumn.CellTemplate>
                                    </toolkit:DataGridTemplateColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="Source"
                                                       Width="Auto"
                                                       Binding="{Binding EsCall.src}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTemplateColumn_2" Header="Sens" Binding="{Binding Way}">
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="Destination"
                                                       Width="Auto"
                                                       Binding="{Binding EsCall.dst}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_14" Header="Règle"
                                                       Width="Auto"
                                                       Binding="{Binding EsCall.rule}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="Début"
                                                       Width="Auto"
                                                       Binding="{Binding EsCall.ts_open}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="Fin"
                                                       Width="Auto"
                                                       Binding="{Binding EsCall.ts_stop}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="Totale"
                                                       Width="Auto"
                                                       Binding="{Binding TotalSpan}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="Dur. conversation"
                                                       Width="Auto"
                                                       Binding="{Binding DialogSpan}" 
                                                       SortMemberPath="GraphicalEsCall.DialogSpan"
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="Dur. sonnerie" CanUserSort="True"
                                                       Width="Auto"
                                                       Binding="{Binding RingingSpan}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="Sonde"
                                                       Width="Auto"
                                                       Binding="{Binding EsCall.sid}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="Groupe de Sécurité"
                                                       Width="Auto"
                                                       Binding="{Binding EsCall.site}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="T2"
                                                       Width="Auto"
                                                       Binding="{Binding EsCall.tdm_line}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="Canal"
                                                       Width="Auto"
                                                       Binding="{Binding EsCall.tdm_chan}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
     
                                    <toolkit:DataGridTextColumn x:Uid="toolkit:DataGridTextColumn_15" Header="Date configuration sonde"
                                                       Width="Auto"
                                                       Binding="{Binding EsCall.conf}"                                             
                                                       >
     
                                    </toolkit:DataGridTextColumn>
                                </toolkit:DataGrid.Columns>
                            </toolkit:DataGrid>

    Voici maintenant la version avec génération automatique
    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <toolkit:DataGrid ScrollViewer.CanContentScroll="True" ScrollViewer.IsDeferredScrollingEnabled="True" EnableColumnVirtualization="True" AlternationCount="2" Name="testing" AutoGenerateColumns="True" RowStyle="{StaticResource RowStyle}" CellStyle="{StaticResource CellStyle}" ColumnHeaderStyle="{StaticResource ColumnHeaderStyle}" Visibility="Collapsed" ItemsSource="{Binding}" />

    J'ai mis des styles pour les cellules, les lignes et le headers pour cette version, cela n'affecte pas les résultats que je les mette ou que je les retire

  4. #4
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Tu pourrais joindre le projet ? (ca m'éviterais de faire le binding, etc... )

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Oui par contre c'est là que ça ne va pas être possible car malheureusement c'est un projet professionnel. Le remplissage du DataGrid se fait par l'intermédiaire d'un WebServices qui emploie un des serveur de ma boite.

    Je suis conscient que cela ne va pas aider à la résolution du problème, mais hormis le XAML, tout le reste du projet fait parti du secret professionnel

    Je voudrais tout de même savoir si tu avais eu l'occasion de bosser avec un DataGrid en lui affectant un grand nombre d'entrées, sans génération automatique des colonnes et avec des DataGridTemplateColumn ? Je n'exclue pas une mauvaise manipulation de ma part. Mais en n'affectant pas mes entrées au DataGrid (et donc pas de représentation visuelle), mon programme consomme à nouveau "que" 50Mo de mémoire. J'en déduis donc que le soucis vient plutôt du contrôle en lui-même, ai-je tord selon toi ?

    De plus une des pistes sur laquelle j'étais parti est qui est naturelle, était d'allouer par bloc (de 50 entrées par exemple) le DataGrid. Malheureusement, n'ayant pas d'event indiquant que le DataGrid a fini d'afficher les entrées, je me retrouve à nouveau dans l'impasse

    Merci d'avance pour ton aide

  6. #6
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 115
    Points : 129
    Points
    129
    Par défaut
    Pour mon cas par exemple j'utilise une progressbar et tu peux utiliser l'event ValueChanged et vérifier si value est égal au maximun.

  7. #7
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Je suis d'accord mais je vois pas comment lier la progression du rendu graphique du DataGrid à celle d'une ProgressBar vu que cette donnée à ma connaissance n'existe pas

  8. #8
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Tu as essayé de faire de la pagination sur ton DataGrid ? J'ai déjà travaillé avec mais pas sur des très grosse quantité de données...

    Citation Envoyé par Yo Eight Voir le message
    Oui par contre c'est là que ça ne va pas être possible car malheureusement c'est un projet professionnel. Le remplissage du DataGrid se fait par l'intermédiaire d'un WebServices qui emploie un des serveur de ma boite.

    Je suis conscient que cela ne va pas aider à la résolution du problème, mais hormis le XAML, tout le reste du projet fait parti du secret professionnel

    Je voudrais tout de même savoir si tu avais eu l'occasion de bosser avec un DataGrid en lui affectant un grand nombre d'entrées, sans génération automatique des colonnes et avec des DataGridTemplateColumn ? Je n'exclue pas une mauvaise manipulation de ma part. Mais en n'affectant pas mes entrées au DataGrid (et donc pas de représentation visuelle), mon programme consomme à nouveau "que" 50Mo de mémoire. J'en déduis donc que le soucis vient plutôt du contrôle en lui-même, ai-je tord selon toi ?

    De plus une des pistes sur laquelle j'étais parti est qui est naturelle, était d'allouer par bloc (de 50 entrées par exemple) le DataGrid. Malheureusement, n'ayant pas d'event indiquant que le DataGrid a fini d'afficher les entrées, je me retrouve à nouveau dans l'impasse

    Merci d'avance pour ton aide

  9. #9
    Membre habitué
    Inscrit en
    Mai 2003
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Mai 2003
    Messages : 115
    Points : 129
    Points
    129
    Par défaut
    ouai c'est vrai moi je la remplis manuellement donc je m'en sort comme ça. Sinon j'ai vus ici
    l'event
    Loaded : Se produit lorsqu'un FrameworkElement a terminé les passes de disposition, a procédé à l'affichage et est prêt pour l'interaction. (Hérité de FrameworkElement.)

    Je n'est pas essayé mais c'est peut être ça que tu cherche la définition s'en rapproche mais je ne sais pas si la Datagrid est un FrameworkElement.

  10. #10
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    @ JediMaster

    L'event Loaded est trompeur car en fait il indique seulement lorsque qu'un FrameworkElement est inséré dans le VisualTree. Plus précisément, cette event est lancé avant même que le composant ne soit affiché. Pour t'en convaincre, je t'invite à tester cet Event avec la classe Window par exemple . Ce que j'aimerais avoir, c'est un Event du DataGrid qui indique qu'il a fini d'afficher ses composants fils (DataRowPresenter, DataColumPresenter, DataRow, DataColumn, DataGridCellPresenter,... etc)

    @Thomas Lebrun

    Concernant la pagination, c'est en effet une solution à laquelle j'ai pensé. Je perds en ergonomie mais au moins j'optimise la mémoire employée (Les machines que l'on vise avec ce produit n'enbarquent qu'1Go de Ram tout au plus). Le soucis c'est que je reçois des mises à jour en temps réel et qu'elles sont automatiques. Il me faudra donc trouver une notification élégante pour informer l'utilisateur de la présence de nouvelles données

    Le volume de donnée c'est bien LE problème du DataGrid malheureusement.
    C'est un composant qui est très facile à utiliser et à personnaliser mais qui consomme beaucoup de ressources d'un point vue professionnel. C'est un point que je n'ai pas vu sur les différents sites ou blogs anglophones qui exposaient des exemples d'utilisation du composant. En effet, ils n'affichaient que rarement plus que 30 lignes sur 10 colonnes.

  11. #11
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Tu as essayé d'utiliser la grille d'XCeed pour voir si cela changeait quelque chose ? (par curiosité)

  12. #12
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Je n'ai pas essayé mais il souffre du même problème, et on en parle ici

  13. #13
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Tu as essayé d'utiliser PerfSuite pour voir si tu pouvais faire quelque chose ?

  14. #14
    Membre régulier
    Étudiant
    Inscrit en
    Février 2007
    Messages
    202
    Détails du profil
    Informations personnelles :
    Âge : 37

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 202
    Points : 97
    Points
    97
    Par défaut
    Un thread en parle sur codeplex : ICI

    Je te Copy & Paste quelques parties qui peuvent peut-être t'aider à résoude ton problème.

    OK - I think I found it - I uninstalled a Wacom USB Tablet driver from my system and now the grid is FAST!

    Is this a tablet issue in general, or just specific to something with the Wacom?
    Ton problème est peut -être lié à un de tes périphériques installés, à vérifier et tester sur une autre machine pour voir si les performances sont semblables.

    After profiling the application, I see an extraordinary amount of calls to DataGridColumn.OnCopyingCellClipboardContent. This method is usually used for each cell to provide data to be placed on the clipboard when copying. In this case, however, the DataGridCellItemAutomationPeer's GetNameCore method is using the clipboard content as the name since a cell's name is rarely set. I presume, this is the name that is displayed in an automation tool, and the content of a cell is more useful in this case. However, this has the result that whenever the automation tree is updated, which happens after layout, every cell that is in view is providing data to the automation peer. This causes a lot of data binding to occur, and generally this is why it is slow.
    The second is to figure out a better way to implement GetNameCore.
    In the March 2009 Toolkit release, DataGridCellItemAutomationPeer's GetNameCore method was changed to "Item: <your item's ToString()>, Column DisplayIndex: <column index>." This is much cheaper to create than the clipboard data and should resolve the issue.

    The Tablet PC Input Panel is, apparently, an automation client and causes WM_GETOBJECT messages to be sent. WPF responds to WM_GETOBJECT by creating an automation peer for the root element (usually a Window). Whenever layout changes, a list of automation peers are called, and this root object is in that list. Due to this call, the entire visual tree's automation tree is created -- that means all of the cells' automation peers are instantiated too. I still don't know why all of this is happening.
    Essaye de voir si tu n'as pas un "automation client" qui provoque l'envoie de WM_GETOBJECT : trackpad ?

  15. #15
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Alors après quelques tests dans la matiné et les conseils de Matsu d'hier soir , j'ai enfin pu identifier les raisons des ralentissements d'affichage et la consommation de mémoire entre génération automatique et manuelle

    Comme tout le monde le sait certainement, avec la génération automatique des colonnes, le datagrid ne charge que les lignes visibles, d'où ses consommation faible en mémoire et sa réactivé amoindri sur le scrowling vertical.

    Et malheursement, ce n'est pas le cas lorsque l'on passe par des colonnes templates. Il charge toutes les données en mémoire, d'où le temps d'affichage long et la consommation gigantesque de mémoire, s'ajoutant à cela des FormatException lorsque je parse des Date de ce format 2009-12-02 14:50:21 par exemple

    Ma question est donc comment activer cette pagination automatique ? Car activer la virtualisation sur les lignes et les colonnes n'a pas l'air de changer quelque chose

    Merci pour votre aide

  16. #16
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2009
    Messages : 97
    Points : 307
    Points
    307
    Par défaut
    Bon je reviens ici car depuis le temps j'ai réglé le problème et aussi trouvé des optimisations pour le chargement d'un DataGrid que je vais poster ici


    C'était bien la virtualisation qui permettait de diminuer la consommation en mémoire du datagrid. Le soucis était que lorsque l'on faisait ses propres colonnes, la virtualisation est désactivée. Voici donc comment la rendre opérante

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    <toolkit:DataGrid ItemsSource={Binding} VirtualizingStackPanel.IsVirtualizing="True" VirtualizingStackPanel.VirtualizationMode="Standard">
         <toolkit:DataGrid.ItemsPanel>
                   <ItemsPanelTemplate>
                          <VirtualizingStackPanel />
                   </ItemsPanelTemplate>
          </toolkit:DataGrid.ItemsPanel>
    </toolkit:DataGrid>

    Ne surtout pas oublier de mettre ceci VirtualizingStackPanel.IsVirtualizing="True" . En effet, le DataGrid est un des rares composants à le désactiver par défaut (lorsque la génération automatique des colonnes est désactivée.

    Maintenant la petite optimisation bien sympa lorsque l'on charge un gros volume de données dans le DataGrid (plusieurs dixaine de milliers dans mon cas) : Charger une ligne à la fois de manière asynchrone pour ne pas bloquer l'interface.

    Voici le code associé:

    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    public partial class Window1 : Window
        {
            List<Contact> list = new List<Contact>();
            ObservableCollection<Contact> ObsContact = new ObservableCollection<Contact>();
            private delegate void DataLoadingDelegate(int nb);
     
            public Window1()
            {
                InitializeComponent();
                for (int i = 1; i < 1000000; i++)
                {
                    list.Add(new Contact("Contact n°" + i.ToString()));
                }
            }
     
            private void Window_Loaded(object sender, RoutedEventArgs e)
            {
                DataContext = ObsContact;
                this.Dispatcher.BeginInvoke(new DataLoadingDelegate(Dataloading), System.Windows.Threading.DispatcherPriority.Background, 0);
            }
     
            void Dataloading(int nb)
            {
                ObsContact.Add(list[nb]);
                if (nb < list.Count)
                {
                    this.Dispatcher.BeginInvoke(new DataLoadingDelegate(Dataloading), System.Windows.Threading.DispatcherPriority.Background, nb++);
                }
            }
    }

    Il faut souscrire à l'event Loaded de votre Window ou UserControl. Ecrire une fonction dédiée au chargement (chez moi DataLoading) en faisant un appel récursif au dispatcher de la Window ou du UserControl, en prenant bien soin de passer le nombre d'éléments déjà ajoutés. L'utilisation d'une ObservableCollection est primordiale car elle notifie à l'interface de se mettre à jour lorsque sa collection change (Add ou Remove)

    Je passe donc ce topic en Résolu

    PS: Pour les utilisateurs du pattern MVVM, il faudra bien sur passer par des AttachedCommandBehavior

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Grosse consommation de mémoire de MySQL
    Par CinePhil dans le forum Administration
    Réponses: 0
    Dernier message: 19/11/2014, 15h41
  2. Problème sur le WPF Toolkit DataGrid click droit
    Par azar121 dans le forum Windows Presentation Foundation
    Réponses: 7
    Dernier message: 03/04/2014, 11h16
  3. Datagrid WPF ToolKIT
    Par Hawkwood dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 21/10/2009, 10h35
  4. Grosse consommation de mémoire au démarrage
    Par guenievre dans le forum Java ME
    Réponses: 7
    Dernier message: 10/10/2007, 11h36
  5. Grosse consommation mémoire de mon application
    Par muad'dib dans le forum Langage
    Réponses: 14
    Dernier message: 18/10/2006, 16h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo