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 :

Connaitre index lignes sur datagridview Vs RowPostPaint [Débutant]


Sujet :

C#

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut Connaitre index lignes sur datagridview Vs RowPostPaint
    Bonsoir

    Je voudrais savoir s'il était possible de connaitre l'index de début et l'index de fin des lignes affichées dans un datagridview.

    Par exemple, j'ai un DGV de 100 lignes mais dans ma fenêtre je ne vois que les lignes de 10 à 23.

    Car j'ai un problème avec l'événement dgView1_RowPostPaint , il s'exécute tout le temps, dès que je redimensionne, je déplace, je classe, ... bref tout le temps

    J'aimerais bien qu'il ne s'exécute qu'une seule fois quand l'affichage de ma zone est fixe.

    J'ai essayé d'arrêter l'événement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.dgView1.RowPostPaint -= new System.Windows.Forms.DataGridViewRowPostPaintEventHandler(this.dgView1_RowPostPaint);
    mais sans succès

    Merci

    @++

    KaloOopS

  2. #2
    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
    Je voudrais savoir s'il était possible de connaitre l'index de début et l'index de fin des lignes affichées dans un datagridview.
    Utiliser this.dgView1.FirstDisplayedCell.RowIndex et this.dgView1.DisplayedRowCount.

    Mais, il n'est pas sûr que l'event RowPostPaint soit vraiment adapté à ce que tu veux faire.

  3. #3
    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
    Je rejoins Grafito !

    Quel est le but final ?

    Il y a probablement d'autres manieres de faire et moins capilotractées !

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    Bonjour

    Quel est le but final ?
    je souhaite changer le backcolor de mon DGV en fonction de la valeur d'une cellule

    c'est un sujet que j'ai déjà évoqué :

    http://www.developpez.net/forums/d10...i/#post6067817

    et ce jour-là on m'avait parlé du RowPrePaint / RowPostPaint

    mais je viens de m'apercevoir que ces événements n'arrêtent pas de s'exécuter et je me retrouve avec un des problèmes de ce post

    http://www.developpez.net/forums/d12...s/#post6885726

    quels événements ou méthodes utiliser alors dans mon cas

    j'ai tenté un foreach avec tous les rows ... mais bon c'est pas top et demande du temps/ressource

    merci

    @++

    KaloOopS

  5. #5
    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
    C'est pourtant bien RowPrepaint qu'il faut utiliser pour faire ce que tu veux faire

    Il s'execute quand c'est nécessaire mais si tu te mets en debug pas a pas, tu interfere forcément avec le paint de ta form et subséquemment avec le RowPrepaint de ton DGV, d'ou sans doute l'impression "ces événements n'arrêtent pas de s'exécuter"

    Tu peux aussi ajouter un test pour eviter l'assignation inutile si la couleur est déja mise

    Et si tu a un problème réel lié a cela je propose que tu envoie le code concerné pour aider a le comprendre

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    Bonjour

    Il s'execute quand c'est nécessaire mais si tu te mets en debug pas a pas, tu interfère forcément avec le paint de ta form
    dès que je touche le DGV, RowPrepaint s'exécute

    a ce moment-là, j'affiche un message dans une fenêtre commande justement pour tracer l'événement donc pas de debug en pas a pas ...

  7. #7
    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
    Soit mais ca n'explique toujours pas quel est le vrai problème ni le code associé !

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    oli'

    ca n'explique toujours pas quel est le vrai problème ni le code associé !
    le "vrai" problème est que j'ai un PC de m...de au boulot qui rame à mort dès qu'on chatouille la base de données et qu'on lui demande de rafraichir le DGV

    avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)
    {
        DataGridViewRow row = dataGridView1.Rows[e.RowIndex];
        DataRowView drv = (DataRowView)row.DataBoundItem;
     
        int value = (int)drv["value"];
        if (value != 0)
        {
            row.DefaultCellStyle.BackColor = Color.Red;
        }
    }
    le changement du backcolor semble fonctionner mais dès qu'on touche le form, ou le dgv (resize, scroll, sorted et autres événements), ça exécute de nouveau le RowPrePaint

    donc avec mon PC de m...rde ca rame ...

    finalement j'ai utilisé une boucle for avec comme limites

    this.dgView1.FirstDisplayedCell.RowIndex et this.dgView1.DisplayedRowCount.
    lorsque j'en ai besoin

    je sais c'est pas trop top mais au moins je suis "maître" du changement de couleur mon DGV

    merci

    pour vos réponses

    @++

    KaloOopS

  9. #9
    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
    Juste pour voir as tu essayé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        if (value != 0 && !row.DefaultCellStyle.BackColor.Equals(Color.Red))
        {
            row.DefaultCellStyle.BackColor = Color.Red;
        }

  10. #10
    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
    je souhaite changer le backcolor de mon DGV en fonction de la valeur d'une cellule
    Si c'est pour changer la couleur d'une cellule en fonction de sa valeur, utiliser l'event CellFormatting.

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    Bonsoir

    ça y est j'arrive à planter mon application dans 100% des cas avec le RowPrePaint (du moins il boucle dans l'événement)

    ni le code associé !
    comme quoi tout arrive ...
    http://kalooops.free.fr/cs/20120911_Database.rar

    il vous faudra changer le DB_NAME dans les settings pour donner le path de la base de données situées dans le répertoire "db" du projet.

    ensuite pour boucler :
    - lancer l'application
    - cliquer sur le bouton recherche et rien d'autre (les options de filtre sont déjà renseignées)
    - ensuite classer le DGV par la colonne "Résultat point haut", les défauts code 0 devraient apparaitre en rouge. A ce niveau là, dans la fenêtre console ça ne boucle pas encore ...
    - ensuite magie de la technologie, reclasser le DGV par la même colonne, les défauts code 11 et 10 apparaissent en bleu/vert ... et la BINGO la console déroule, déroule et votre processeur mouline ...

    sympa non ??

    merci, pendant ce temps vais essayer :
    utiliser l'event CellFormatting.
    et le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (value != 0 && !row.DefaultCellStyle.BackColor.Equals(Color.Red))
    @++

    KaloOopS

    PS : pour ma défense, beaucoup d'événements sont sur le DGV mais sans interaction, c'était pour essayer les différents événements
    PS' : attendez je refais le *.rar pour avoir une version light

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    pour info

    merci, pendant ce temps vais essayer :

    utiliser l'event CellFormatting.
    et le
    if (value != 0 && !row.DefaultCellStyle.BackColor.Equals(Color.Red))
    même sanction, même punition

  13. #13
    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
    Peux-tu indiquer le code de l'event CellFormatting ?

    Si tu n'actives pas le cellformatting, que se passse-t'il ?

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    Exactement le même que dans le RowPrePaint (DataGridViewRowPrePaintEventArgs e)

    puisque le DataGridViewCellFormattingEventArgs e, contient aussi un e.RowIndex

    Sinon j'ai refait le *.rar
    http://kalooops.free.fr/cs/20120911_Database.rar

    @++

    KaloOopS

  15. #15
    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
    pour CellPainting il faut faire e.CellStyle.BackColor=Color.Red

    Si tu fais row.DefaultCellStyle.BackColor = Color.Red, cela va engendrer un repaint de toutes les cellules déclenchant donc de nouveaux CellFormatting et ainsi de suite ....

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    Merci Graf'

    CA FONCTIONNE !!!!!!!! ... enfin

    par contre est-ce qu'il y a moyen de figer l'événement lorsque je bouge ou redimensionne ma form ?

    je peux faire le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.dgView1.CellFormatting -= new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.dgView1_CellFormatting);
    mais comment/quand le réactiver ?

    merci

    @++

    KaloOopS

    PS : je retire le *.rar

  17. #17
    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
    Pour réactiver l'event, c'est "+=" au lieu de "-=" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.dgView1.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.dgView1_CellFormatting);
    Mais je te déconseille de déactiver cet event pour les raisons suivantes:

    • le cellformatting ne pénalise pas beaucoup les repaint liés au resize et, en principe, pas du tout la performance du move de la form,
    • il faudrait mettre un timer pour s'assurer que la taille est restée inchangée pendant disons 1 seconde.
    • dans ce cas, il faudrait lancer le dataGridView.refresh()

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    166
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2010
    Messages : 166
    Points : 84
    Points
    84
    Par défaut
    oki pour toutes ces précisions

    je clos le post

    merci pour toutes vos réponses

    @++

    KaloOopS

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/03/2009, 17h22
  2. Lier le comportement de 2 combobox sur une ligne de datagridview
    Par Delphi-ne dans le forum Windows Forms
    Réponses: 0
    Dernier message: 16/03/2009, 16h03
  3. Réponses: 2
    Dernier message: 20/07/2008, 20h50
  4. Réponses: 11
    Dernier message: 06/08/2007, 16h22
  5. [C#][DataGridView]Comment selectionner ligne sur Click Droit ?
    Par VincenzoR dans le forum Windows Forms
    Réponses: 12
    Dernier message: 23/12/2005, 22h34

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