20 messaggi dal 30 maggio 2007
Salve, nella mia applicazione utilizzo un controllo DataGrid (.net 4) per gestire l'immissione e la modifica dei dati.
Il problema è che anche un Datagrid relativamente poco complesso (popolato via mvvm e composto da qualche decina di righe e qualche decina di colonne di tipo DataGridTemplateColumn) su un pc con vga integrata neanche troppo scarsa (chipset G31) impiega dagli 8 ai 10 secondi per essere visualizzato.
Ho provato ad impostare
RenderOptions.ProcessRenderMode = RenderMode.SoftwareOnly
ma non sembra cambiare assolutamente nulla.
Preciso comunque che non è colpa del controllo datagrid, infatti lo stesso problema lo riscontro se tento di caricare un qualsiasi altro controllo che contenga molte TextBox.
Esiste qualche trucco per velocizzare il rendering senza ricorrere alla paginazione visto che, trattandosi di poche decine di righe (al massimo un centinaio) preferirei gestire attraverso lo scrolling?

Grazie in anticipo
Andrea
Modificato da andypat il 08 luglio 2010 15.40 -
mmm, mi sembrano molto poche le quantità, anche per un pc poco potente. Sicuro che il problema non sia nel caricamento dei dati?
Ad esempio se metti in binding una sorgente fittizia di 10 righe per 10 colonne hai le stesse performance?

Ciao

Il mio blog
Homepage
20 messaggi dal 30 maggio 2007
Prima di tutto (come al solito) grazie per la risposta.
Purtroppo il problema non è nel caricamento perchè utilizzo una cache (i dati provengono da un dispositivo usb e vengono letti quando il dispositivo viene connesso e poi aggiornati solo quando serve); in più se cambio il tipo di controllo utilizzando ad es. una listview i tempi per la visualizzazione calano drasticamente. Non vorrei che il problema potesse derivare dal mio abuso di datatemplate.

Questa è una colonna tipo di un datagrid:
<DataGridTemplateColumn Header="{x:Static res:Strings.lblId}" HeaderStyle="{StaticResource DataGridBaseHeaderStyle}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=Id, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=True}" Style="{StaticResource CellBoxStyle}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

e questi gli stili
<Style x:Key="SampleRowStyle" TargetType="{x:Type DataGridRow}">
<Setter Property="IsSelected" Value="{Binding IsSelected}" />
</Style>

<Style TargetType="{x:Type DataGrid}" x:Key="DataGridStyle" >
<Setter Property="AutoGenerateColumns" Value="False" />
<Setter Property="HeadersVisibility" Value="Column" />
<Setter Property="CanUserReorderColumns" Value="False"/>
<Setter Property="CanUserDeleteRows" Value="False"/>
<Setter Property="CanUserAddRows" Value="False"/>
<Setter Property="CanUserResizeRows" Value="False"/>
<Setter Property="CanUserResizeColumns" Value="False"/>
<Setter Property="RowStyle" Value="{StaticResource SampleRowStyle}" />
</Style>

<Style x:Key="DataGridBaseHeaderStyle" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="IsTabStop" Value="False"/>
<Setter Property="SeparatorBrush" Value="{StaticResource GridBorderBrush}"/>
<Setter Property="Padding" Value="8"/>
</Style>

questo stile mi serve per la visualizzazione degli errori
<Style TargetType="{x:Type TextBox}" x:Key="CellBoxStyle">
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<StackPanel Orientation="Horizontal">
<AdornedElementPlaceholder x:Name="adorner" />
<Label Name="validationError"
Background="{StaticResource ValidationErrorBackgroundBrush}"
Foreground="{StaticResource WhiteGlyphBrush}"
VerticalAlignment="Center"
Content="{Binding ElementName=adorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}">
<Label.Triggers>
<EventTrigger RoutedEvent="Label.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetName="validationError"
Storyboard.TargetProperty="Opacity" From="0.0" To="0.85"
Duration="0:0:0.6" AutoReverse="False" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Label.Triggers>
</Label>
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
PS
Anche non utilizzando lo stile per la visualizzazione degli errori il caricamento rimane lento
61 messaggi dal 20 maggio 2009
Ciao, io avevo il tuo stesso problema, 800 riga per 50 colonne, textxolum qualche templatecolum ma non complesse come le tue.
ho risolto utilizzando un datagrid di Telerik, 1.000.000 di record e 50 colonne è velocissimo (2-3 secondi) sia al caricamento sia nei filtri.

Verifica anche di non avere messaggi o avvisi su errati di Binding che rallentano il caricamento dei dati.

Vivaldi Francesco
concordo con @artanis: controlla che non vengano generate eccezioni in fase di binding (magari qualche evento di validazione ad esempio).

L'uso dei template non dovrebbe rallentare troppo l'esecuzione...considera che applicando un template non fai altro che sovrascrivere quello già esistente, non aggiungere (ovviamente è più complesso di così, ma rende l'idea :) )

Davide Guida
Technical Architect @ Razorfish Healthware
http://davideguida.altervista.org

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.