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 Forms Discussion :

DataGridView avec un DataBinding et colonnes formattées


Sujet :

Windows Forms

  1. #1
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut DataGridView avec un DataBinding et colonnes formattées
    Bonjour,

    J'ai un DataGridView qui est alimenté par un BindingSource.
    Le rafraîchis le DataSource du BindingSource toutes les 5 secondes avec un DataTable, qui a toujours la même structure (même requête rejoutée dans un Timer).

    Dans un premier temps, j'avais activé "autogeneratecolumns" et "autosize" des colonnes en fonction de la taille du contenu des cellules.

    Ça marche très bien, mais je me rends compte que la partie UI est EXTREMEMENT lente (il faut dire aussi que mon PC est une brouette).

    J'ai donc décidé de créer à l'avance mes colonnes, et leur attribuer une taille fixe.

    Seul hic : maintenant, mes colonnes créées à la main à l'avance ne sont pas remplies, et le contenu de mon DataTable se met dans de nouvelles colonnes.

    Comment remédier à ce problème ?
    On ne jouit bien que de ce qu’on partage.

  2. #2
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    Voici la partie du code concernée :

    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
     
    namespace UEDISurvey
    {
        public partial class Form1 : Form
        {
            BindingSource bsFil = new BindingSource();
     
            public Form1()
            {
                filView.DataSource = bsFil;
     
                timer1.Enabled = true;
                timer1.Start();
     
                timer1_Tick(null, null);
            }
     
            private void timer1_Tick(object sender, EventArgs e)
            {
                filViewFill();
            }
     
            private void filViewFill()
            {
                    using (OleDbConnection cnx = new OleDbConnection(string.Format("Provider=msdaora;Data Source={0};User Id={1};Password={2};", DataSource, Login, Password)))
                    {
                        DataTable dt = new DataTable();
     
                        cnx.Open();
     
                        using (OleDbCommand cmd = cnx.CreateCommand())
                        {
                            cmd.CommandText = "select f.fil, decode(automanu, 'E', 0, round((to_date(heudeb, 'hh24mi') - to_date(heuact, 'hh24mi')) * 1440, 0)) bloquee, substr(heudeb, 1, 2) || ':' || substr(heudeb, 3, 2) heudeb, (select count(*) from ut_spl s where s.codsoc = m2.codsoc and s.batch = f.fil and s.st1 = 1 and s.eshs = 'ES') attente, s.numero from mev m1 inner join mev m2 on m2.codsoc = m1.codsoc and m2.codent = 'UT_SPL' and m2.segment = ' ' inner join ut_fil f on f.codsoc = m1.codsoc_phy inner join ut_spl s on s.codsoc = m2.codsoc_phy and s.batch = f.fil where m1.codsoc = ? and m1.codent = 'UT_FIL' and m1.segment = ' ' and f.eshs = 'ES' and f.nbrpro > 0 and s.st1 < 4 and s.datdeb != ' ' and (s.automanu != 'E' or s.st1 != 1) order by fil";
                            OleDbParameter p1 = cmd.CreateParameter();
                            p1.ParameterName = "codsoc";
                            p1.DbType = DbType.VarNumeric;
                            p1.Value = Codsoc;
                            cmd.Parameters.Add(p1);
     
                            OleDbDataAdapter da = new OleDbDataAdapter(cmd);
                            da.Fill(dt);
                        }
     
                        bsFil.DataSource = dt;
                        cnx.Close();
                }
            }
        }
    }
    On ne jouit bien que de ce qu’on partage.

  3. #3
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut Bon ben à la guerre comme à la guerre
    En l'absence de solution propre, j'ai viré l'utilisation de mes BindingSource (qui sont surtout utiles quand on se balade dans les lignes et qu'on veut ensuite mettre à jour la base).

    Et voici par quoi je les ai remplacés :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
                filView.Rows.Clear();
     
                foreach (DataRow r in dt.Rows)
                {
                    DataGridViewRow gr = filView.Rows[filView.Rows.Add()];
                    for (int i = 0; i < r.ItemArray.Length; i++)
                    {
                        gr.Cells[i].Value = r.ItemArray[i];
                    }
                }
    Si vous avez une idée pour avoir encore de meilleures performances, je suis preneur !
    On ne jouit bien que de ce qu’on partage.

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 152
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 152
    Points : 7 402
    Points
    7 402
    Billets dans le blog
    1
    Par défaut
    En tout cas, la lenteur venait bien de là...

    Avec un timer sur 5 secondes, 9 fois sur 10 il fallait attendre plus de 20 secondes entre deux refresh (donc timer saturé par le code trop lent).

    Maintenant, avec un timer de 1 seconde, ça rafraîchis bien instantanément.

    Cool

    Bon ben c'est acté : les BindingSource, c'est pour les amoureux de Java qui aiment faire des usines à gaz...
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Citation Envoyé par StringBuilder Voir le message
    En tout cas, la lenteur venait bien de là...
    Je pense qu'il aurait suffit de rajouter bsFil.DataSource = null au début de la fonction filViewFill() pour résoudre le problème.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Expert confirmé
    Inscrit en
    Avril 2008
    Messages
    2 564
    Détails du profil
    Informations personnelles :
    Âge : 64

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 564
    Points : 4 441
    Points
    4 441
    Par défaut
    bonjour StringBuilder.

    J'ai donc décidé de créer à l'avance mes colonnes, et leur attribuer une taille fixe.
    Seul hic : maintenant, mes colonnes créées à la main à l'avance ne sont pas remplies, et le contenu de mon DataTable se met dans de nouvelles colonnes.
    Ca n'est pas que je suis amoureux de Java ni du BindingSource mais je suis amoureix de la Doc MSDN .
    Voici ce est dit du mode "dependant" ou lie à la source(par BindingDource ou directement à une table ou une liste) concernant la personnalisation des colonnes:
    Citation à mediter :
    Le mode Dépendant convient pour gérer des données qui utilisent une interaction automatique avec le magasin de données. Vous pouvez attacher directement le contrôle DataGridView à sa source de données en définissant la propriété DataSource. Lorsque le contrôle est lié aux données, les lignes de données sont envoyées et extraites sans nécessiter une gestion explicite de votre part. Lorsque la propriété AutoGenerateColumns est true, chaque colonne dans votre source de données fera en sorte qu'une colonne correspondante soit créée dans le contrôle. Si vous préférez créer vos propres colonnes, vous pouvez attribuer à cette propriété la valeur false et utiliser la propriété DataPropertyName pour lier chaque colonne lorsque vous le configurez. C'est utile lorsque vous souhaitez utiliser un type de colonne autre que les types qui sont générés par défaut.
    Cela independendemment de ce qu'as dit POL63,mais pour les jeunes je dirais que c'est un peu "jeter le manche après la cognée".......
    Tu aurais pu continuer apres avoir mis AutoGenerateColumns à false et preciser les DataPropertyName et la largeur,couleur header et consorts sur ton dgv...............
    bon code.................

Discussions similaires

  1. DataGridView avec colonne CheckBox 2 (le retour xD)
    Par DarkSeiryu dans le forum Windows Forms
    Réponses: 8
    Dernier message: 19/02/2009, 15h04
  2. Réponses: 1
    Dernier message: 24/10/2008, 13h08
  3. Datagridview avec colonne de plusieurs types
    Par Laur3nT dans le forum Windows Forms
    Réponses: 3
    Dernier message: 08/07/2008, 16h33
  4. Réponses: 7
    Dernier message: 28/06/2008, 19h44
  5. Réponses: 6
    Dernier message: 17/06/2008, 11h28

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