Bonjour,
je sollicite vos conseils afin d'accélérer le chargement de ma datagrid tout en gardant la facilté de binding sur ma datagrid.
Actuellement, pour charger 10 000 enregistrements dans ma datagrid, cela me prend environ 8 secondes
Voici mon code
Code : 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 <DataGrid x:Name="dgdEnregistrement" Margin="8,150,8,8" VerticalAlignment="Top" Style="{DynamicResource MyDataGridStyle}" ColumnHeaderStyle="{DynamicResource MyDataGridColumnHeaderStyle}" RowStyle="{DynamicResource MyDataGridRowStyle}" CellStyle="{DynamicResource MyDataGridCellStyle}"> <DataGrid.Columns> <DataGridTextColumn Header="Code Id" Binding="{Binding id_util}"/> <DataGridTextColumn Header="Nom" Binding="{Binding nom_util}"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="TextWrapping" Value="Wrap" /> <Setter Property="MaxWidth" Value="150" /> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> <DataGridTextColumn Header="Prénom" Binding="{Binding prn_util}"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="TextWrapping" Value="Wrap" /> <Setter Property="MaxWidth" Value="150" /> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> <DataGridTextColumn Header="Email" Binding="{Binding mail_util}"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="TextWrapping" Value="Wrap" /> <Setter Property="MaxWidth" Value="150" /> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> <DataGridTextColumn Header="Identifiant" Binding="{Binding nom_conn_util}"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="TextWrapping" Value="Wrap" /> <Setter Property="MaxWidth" Value="150" /> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> <DataGridTextColumn Header="Groupe" Binding="{Binding groupe.lib_grp}"> <DataGridTextColumn.ElementStyle> <Style TargetType="TextBlock"> <Setter Property="TextWrapping" Value="Wrap" /> <Setter Property="MaxWidth" Value="150" /> </Style> </DataGridTextColumn.ElementStyle> </DataGridTextColumn> <DataGridTextColumn Header="Configuration" Binding="{Binding groupe.acces_param}"/> <DataGridTextColumn Header="Mise à jour" Binding="{Binding groupe.acces_maj}"/> <DataGridTextColumn Header="Manuel" Binding="{Binding groupe.acces_manuel}"/> <DataGridTextColumn Header="Prodotec" Binding="{Binding groupe.acces_gestProd}"/> <DataGridTextColumn Header="Impression" Binding="{Binding groupe.acces_gestImp}"/> </DataGrid.Columns> </DataGrid>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14 private void tbxRecherche_KeyDown(object sender, System.Windows.Input.KeyEventArgs e) { //Touche ENTER if (e == null || e.Key == Key.Enter) { if (a == null) { a = new Thread(new ParameterizedThreadStart(LoadData)); a.Start(tbxRecherche.Text); } } }
Code : 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 public void LoadData(Object param) { Application app = System.Windows.Application.Current; if (app != null) app.Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)delegate { x = new MyMessageBoxWait("Mise à jour des enregistrements"); x.ShowDialog(); }); listUtilisateur = daoUtilisateur.FindAll(param.ToString()); if (app != null) app.Dispatcher.BeginInvoke(DispatcherPriority.Background, (Action)delegate { if (listUtilisateur != null) { if (listUtilisateur != null && listUtilisateur.Count > 1) lblEnregistrement.Content = listUtilisateur.Count + " Enregistrements"; else lblEnregistrement.Content = listUtilisateur.Count + " Enregistrement"; } else lblEnregistrement.Content = "0 Enregistrement"; dgdEnregistrement.ItemsSource = listUtilisateur; dgdEnregistrement.SelectedValue = listUtilisateur; x.Visibility = Visibility.Hidden; x.Close(); }); a = null; }Ce qui me prends du temps, ce n'est pas l'éxécution de la requête en elle même mais la génération du modele métier dans la méthode FindAll
Code : 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 public ObservableCollection<MdlUtilisateur> FindAll(String name = "") { //Requete string query = "SELECT id_util, nom_util, prn_util, mail_util, nom_conn_util, mdp_conn_util, id_grp " + "FROM ls_util WHERE nom_util LIKE CONCAT('%', @param1, '%') AND vis_util = 1 ORDER BY nom_util"; MySqlCommand cmd = null; MySqlDataAdapter ad = null; DataTable dt = null; DaoGroupe daoGroupe = null; ObservableCollection<MdlUtilisateur> listUtilisateur; try { //Preparation de la requete cmd = new MySqlCommand(query, this.connection); cmd.Parameters.AddWithValue("@param1", name); ad = new MySqlDataAdapter(); ad.SelectCommand = cmd; dt = new DataTable(); ad.Fill(dt); //Resultat if (dt.Rows.Count != 0) { daoGroupe = FactoryDao.getDaoGroupe(); listUtilisateur = new ObservableCollection<MdlUtilisateur>(); foreach (DataRow dr in dt.Rows) { listUtilisateur.Add(new MdlUtilisateur(Convert.ToInt64(dr[0]), dr[1].ToString(), dr[2].ToString(), dr[3].ToString(), dr[4].ToString(), dr[5].ToString(), daoGroupe.findById(Convert.ToInt64(dr[6])))); } return listUtilisateur; } else return null; } catch (Exception ex) { UtilsUi.ShowMessageError(ex); return null; } finally { //Liberation des ressources cmd.Dispose(); ad.Dispose(); dt.Dispose(); daoGroupe = null; listUtilisateur = null; } }
Est ce la bonne méthode ?
Comment puis je accélérer tout ça ?
Merci
Partager