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

C# Discussion :

DataGridView en simple


Sujet :

C#

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 8
    Points
    8
    Par défaut DataGridView en simple
    Bonjour a tous !
    J' ai fait une petite application qui utilise un DataGridView en remplissant les champs simplement avec les méthodes DataGridView.Rows.Add() puis en accèdant aux Rows avec leur index ...
    Je me suis apercu vers la fin que cela posant un gros problèmes de performances si on charge quelques 2000 lignes (quasiment inutilisable ..)alors qu' avec 15 cela reste fluide ...

    Suis- je obliger de tout refaire avec une BDD ? en utilisant une liste d' objets ?

    Y a t' il une option que j' ai manquée ??

    Merci pour votre lecture

    NB : je charge en fait des fichiers de sous-titre srt, donc les données ne sont pas énormes ...

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 441
    Points
    441
    Par défaut
    Salut,

    Poste ton code stp

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Voici le 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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
     
     private void remplir(string fichier, int append_time)
            {
     
                StreamReader reader = new StreamReader(fichier, System.Text.Encoding.Default);
                string ligne = string.Empty;
                string item = string.Empty;
     
     
                while ((ligne = reader.ReadLine()) != null)
                {
                     try
                {
     
                    if (utils.IsNumeric(ligne) == true && item != string.Empty)
                    {
                        // 1 00:01:46,400 --> 00:01:52,905 ALEXANDRE
     
                        string[] splititem = item.Split(new string[] { "\n", "-->", "\n", }, System.StringSplitOptions.None);
     
                        string item_numero = splititem[0];
                        string item_debut = splititem[1];
                        string item_fin = splititem[2];
     
                        string item_texte = null;
                        for (int i = 3; i < splititem.Count(); i++)
                        {
                           item_texte += splititem[i] + "\n";
                        }
                        item_texte = utils.RemoveEmptyLines(item_texte);
     
                        this.Grid.Rows[this.Grid.Rows.Count - 1].Cells["Numero"].Value = splititem[1];
                        this.Grid.Rows[this.Grid.Rows.Count - 1].Cells["Debut"].Value = splititem[1];
                        this.Grid.Rows[this.Grid.Rows.Count - 1].Cells["Fin"].Value = splititem[1];
                        this.Grid.Rows[this.Grid.Rows.Count - 1].Cells["Texte"].Value = splititem[1];
     
     
                        item = null;
                        item += ligne + "\n";
                       // Application.DoEvents();
     
                    }
                    else
                    {
                        item += ligne + "\n";
                    }
                } catch (System.Exception m)
                 {
                     item = null;
                     item += ligne + "\n";
                     Debug.WriteLine("remplir : " + m.Message);
     
                 }
     
     
     
                } // FIN while ..
     
     
                //deselect_rows();
                reader.Close();
     
     
                Grid.Sort(new RowComparerDebut_milliseconds(SortOrder.Ascending)); renum();          
     
                this.Debut_UpDown.Maximum = Convert.ToInt32(soustitre.soustitreliste[soustitre.soustitreliste.Count -1 ].Fin_milliseconds);
                this.Fin_UpDown.Maximum = Convert.ToInt32(soustitre.soustitreliste[soustitre.soustitreliste.Count -1 ].Fin_milliseconds);
                this.Duree_UpDown.Maximum = Convert.ToInt32(soustitre.soustitreliste[soustitre.soustitreliste.Count -1 ].Fin_milliseconds);
     
     
           }
    Il s' agit donc bien d' une "Unbound Grid" ...

    NB : à l' import , le split est ausi très lent (mettons 1 minute pour importer un simple fichier ...)mais la navigation en elle-même devient impossible tellement c' est lent .

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Pardon, il fallait lire ceci !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     this.Grid.Rows.Add();
                        this.Grid.Rows[this.Grid.Rows.Count - 1].Cells["Numero"].Value = splititem[0];
                        this.Grid.Rows[this.Grid.Rows.Count - 1].Cells["Debut"].Value = splititem[1];
                        this.Grid.Rows[this.Grid.Rows.Count - 1].Cells["Fin"].Value = splititem[2];
                        this.Grid.Rows[this.Grid.Rows.Count - 1].Cells["Texte"].Value = splititem[3];
    Désolé ...

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 441
    Points
    441
    Par défaut
    Utils...C'est quoi ?

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Je teste simplement pour voir si la ligne correspond a un chiffre valide .
    Chaque item correspond donc à un sous-titre comprenant son numero (increment), le debut, la fin (de l' affichage ..) et le texte ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     public static bool IsNumeric(string chkNumeric)
            {
                int intOutVal;
                bool isValidNumeric = false;
                isValidNumeric = int.TryParse(chkNumeric, out intOutVal);
                return isValidNumeric;
            }
    Pour info, voila à quoi ressemble un fichier srt :
    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
    1
    00:01:46,400 --> 00:01:52,905
    ALEXANDRE
     
    2
    00:02:10,924 --> 00:02:15,553
    "La chance sourit aux audacieux."
    VIRGILE - L'Enéide
     
    3
    00:02:19,766 --> 00:02:24,020
    BABYLONE, PERSE - JUIN 323 AV. J-C
     
    4
    00:03:02,100 --> 00:03:04,852
    Alexandre, l'armée va se diviser.
     
    5
    00:03:05,020 --> 00:03:08,105
    Les satrapes se révolteront.
    Sans ordres, il y aura la guerre.
     
    6
    00:03:08,357 --> 00:03:10,775
    Nous t'en prions. Dis-nous qui.
     
    7
    00:04:08,125 --> 00:04:10,584
    ALEXANDRIE, EGYPTE 285 AV. J-C
    40 ANS PLUS TARD
    Je précise bien que même si l' import est lent , la navigation l' est tout autant ..

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 441
    Points
    441
    Par défaut
    Essaie de voir ou se situe le goulot d’étranglement(IO)... Mets un point d’arrêt sur ta condition et un autre sur ta boucle et ensuite regarde ou ça met du temps.

    Ensuite quand tu dis que l'importation est longue... Situes nous un ordre de grandeur stp

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Il faut compter environ 10 secondes pour un fichier de 2000 sous-titre ..
    Lors de la navigation, je sélectionne les lignes entières et met simplement les valeurs des colonnes dans des textbox et des NumericUpDown ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      this.Debut_UpDown.Value = Convert.ToInt32(Grid.Rows[Grid.SelectedRows[0].Index].Cells["Debut_milliseconds"].Value.ToString());
                    this.Fin_UpDown.Value = Convert.ToInt32(Grid.Rows[Grid.SelectedRows[0].Index].Cells["Fin_milliseconds"].Value.ToString());
                    this.Duree_UpDown.Value = this.Fin_UpDown.Value - this.Debut_UpDown.Value;
                    this.textBox.Text = Grid.Rows[Grid.SelectedRows[0].Index].Cells["texte"].Value.ToString();
    C' est tout ce qu' il y a dans l' evenement CellClick...mais ca prends 4-5 secondes pour que les données soient rapatriées .

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 441
    Points
    441
    Par défaut
    Pour l'importation 10 secondes je trouve ça plutôt correct...

    En fait le problème si j'ai bien compris c'est que tu veux cliquer sur une ligne de la grille et que les données s'affiche dans des textbox et numericupdow?

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 441
    Points
    441
    Par défaut
    Citation Envoyé par fredele Voir le message
    Il faut compter environ 10 secondes pour un fichier de 2000 sous-titre ..
    Lors de la navigation, je sélectionne les lignes entières et met simplement les valeurs des colonnes dans des textbox et des NumericUpDown ..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
      this.Debut_UpDown.Value = Convert.ToInt32(Grid.Rows[Grid.SelectedRows[0].Index].Cells["Debut_milliseconds"].Value.ToString());
                    this.Fin_UpDown.Value = Convert.ToInt32(Grid.Rows[Grid.SelectedRows[0].Index].Cells["Fin_milliseconds"].Value.ToString());
                    this.Duree_UpDown.Value = this.Fin_UpDown.Value - this.Debut_UpDown.Value;
                    this.textBox.Text = Grid.Rows[Grid.SelectedRows[0].Index].Cells["texte"].Value.ToString();
    C' est tout ce qu' il y a dans l' evenement CellClick...mais ca prends 4-5 secondes pour que les données soient rapatriées .
    Je penses que c'est normal. Avant de pouvoir s'afficher il refait une importation et seuelement après il affiche.

    EDIT : Créer une procedure pour celà et mets ce code dedans

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Le problème, c' est uniquement la lenteur ...
    Avec un fichier de 15 sous-titre ca réagit au tac-o-tac, mais avec 2000, il faut attende 4-5 secondes pour que la ligne soit sélectionnée et pour que l' utilisateur puisse modifier les données . C' est pas super je trouve ...

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 441
    Points
    441
    Par défaut
    et si tu fais comme ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    this.textBox.Text = Grid.SelectedRows[0].Cells["texte"].Value.ToString();

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Oui effectivement, c' est mieux écrit mais non, ca change rien ..
    Je pense que c' est parce que je ne crée pas d' objet en tant que Datasource,

    Quels sont les alternatives pour essayer de changer de stratégie? XML ? ..
    C' est juste que là ca devient tout de suite compliquer sachant qu' il faut des Handlers et tout et tout juste pour ca ..

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Je viens d' essayer de faire des objets sous-titre, et là le chargement est beaucoup plus rapide, la navigation parfaite, mais le code est a refaire..

    Encore Merci

  15. #15
    Membre émérite
    Profil pro
    Mangeur de gauffre
    Inscrit en
    Octobre 2007
    Messages
    4 413
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Mangeur de gauffre

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 413
    Points : 2 498
    Points
    2 498
    Par défaut
    Citation Envoyé par fredele Voir le message
    Je pense que c' est parce que je ne crée pas d' objet en tant que Datasource,
    Je pense que effectivement il est beaucoup plus propre et rationnel de charger des données dans une Datatable et d'utiliser cette datatable en Datasource de ton DGV tu vas passer de 10 secondes a presque rien et tu aura une isolation beaucoup plus saine de ta vue et de tes données
    Un datagridview n'est pas destiné a etre un container de donnée

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Ah oui, j' ai cheché ce matin avant ton post et suit tombé sur la même solution . C' est vue juste et effectivement tout se déroule de facon super fluide ..

    je viens juste de comprendre comment faire pour ajouter mes données et mon code devient ...
    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
     private void remplir(string fichier, int append_time)
            {
                DataTable table = new DataTable();
                this.Grid.DataSource = table;
                table.Columns.Add("Numero", System.Type.GetType("System.String"));
                table.Columns.Add("Debut", System.Type.GetType("System.String"));
                table.Columns.Add("Fin", System.Type.GetType("System.String"));
                table.Columns.Add("Debut_milliseconds", System.Type.GetType("System.String"));
                table.Columns.Add("Fin_milliseconds", System.Type.GetType("System.String"));
                table.Columns.Add("Texte", System.Type.GetType("System.String"));
     
                StreamReader reader = new StreamReader(fichier, System.Text.Encoding.Default);
                string ligne = string.Empty;
                string item = string.Empty;
     
     
                while ((ligne = reader.ReadLine()) != null)
                {
                     try
                {
     
                    if (utils.IsNumeric(ligne) == true && item != string.Empty)
                    {
                        // 1 00:01:46,400 --> 00:01:52,905 ALEXANDRE
     
                        string[] splititem = item.Split(new string[] { "\n", "-->", "\n", }, System.StringSplitOptions.None);
     
                        string item_numero = splititem[0];
                        string item_debut = splititem[1];
                        string item_fin = splititem[2];
     
                        string item_texte = null;
                        for (int i = 3; i < splititem.Count(); i++)
                        {
                           item_texte += splititem[i] + "\n";
                        }
                        item_texte = utils.RemoveEmptyLines(item_texte);
     
                        table.Rows.Add(splititem[0], splititem[1], splititem[2], Convert.ToString(utils.milliseconds_from_hours(splititem[1])), Convert.ToString(utils.milliseconds_from_hours(splititem[2])), splititem[3]);
                        item = null;
                        item += ligne + "\n";
     
     
     
                    }
                    else
                    {
                        item += ligne + "\n";
                    }
                } catch (System.Exception m)
                 {
                     item = null;
                     item += ligne + "\n";
                     Debug.WriteLine("remplir : " + m.Message);
     
                 }
     
     
     
                } // FIN while ..
     
     
     
                //deselect_rows();
                reader.Close();
     
     
                Grid.Sort(new RowComparerDebut_milliseconds(SortOrder.Ascending)); renum();
     
                this.Debut_UpDown.Maximum =Convert.ToInt32( this.Grid.Rows[this.Grid.Rows.Count - 1].Cells["Fin_milliseconds"].Value);
                this.Fin_UpDown.Maximum = Convert.ToInt32(this.Grid.Rows[this.Grid.Rows.Count - 1].Cells["Fin_milliseconds"].Value);
                this.Duree_UpDown.Maximum = Convert.ToInt32(this.Grid.Rows[this.Grid.Rows.Count - 1].Cells["Fin_milliseconds"].Value);
     
     
           }
    Là j' ai plus le temps de voir , mas j' ai remarqué que certaines fonctions fonctionnent quand même alors que je n' ai rien changé d' autre dans le reste du code.

    En effet, pour tout le reste je reprends bien les valeurs de la DataGridView et non celle de ta datatable.

    Question : Dois-je modifier le reste de mon code quand même ?, la table est-elle mise-à-jour automatiquement à partir de la DataGridView ?
    J' y gagne quoi ?


    Oui, je sais, je deviens fainéant, vue que je devrais chercher moi-même ...

    Merci a tous

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    22
    Détails du profil
    Informations personnelles :
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Mars 2009
    Messages : 22
    Points : 8
    Points
    8
    Par défaut
    Oui, je confirme : en accèdant simplement à la GridView la table se met à jour automatiquement et mon code n' est pas perdu : les performances sont à présent tout autre ...

    Encore Merci a vous tous !

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

Discussions similaires

  1. DataGridView Mise à jour de la base de façon simple ..?
    Par gregcat dans le forum Windows Forms
    Réponses: 1
    Dernier message: 18/10/2007, 18h46
  2. Effet de transition simple entre 2 images
    Par ChrisFAPS dans le forum Flash
    Réponses: 2
    Dernier message: 18/04/2003, 12h41
  3. Bon je vais essayer d'être simple :
    Par fpouget dans le forum Langage SQL
    Réponses: 8
    Dernier message: 09/04/2003, 17h46
  4. Edition d'un simple fichier java
    Par mcrepin dans le forum Eclipse Java
    Réponses: 5
    Dernier message: 21/03/2003, 14h28
  5. recherche exemple simple pour corba en c++
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 06/05/2002, 11h29

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