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 :

Collision dgv et form paint


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    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
    Par défaut Collision dgv et form paint
    Bonjour

    J'ai identifié qq problemes lors de la mise en couleur de cellule de DGV
    C'est asser subtil

    Voir le code ci dessous

    1- J'ouvre une forme qui doit afficher un dgv depuis une liste passée dans le constructeur

    j'ai placé le traitement du DGV dans une fonction
    Ce traitement effectue entre autre la mise en couleur de cellules du DGV en fonction de valeurs dans le datasource

    Constats :
    1- Si j'appelle cette fonction dans le constructeur de la form apres initialisecomponent, le DGV s'affiche correctement mais PAS de couleurs

    2- Si j'appelle cette fonction a la main a l'aide d'un bouton dans la form : TOUT est ok, les couleurs aussi

    3- Si j'appelle cette fonction depuis l'event Shown, c'est bon aussi MAIS
    l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
         dgv_lstMeta.Columns["Value"].Width = 50;
    Qui concerne comme par hazard la colonne dont je modifie les couleurs se plante (mais si je change le width d'une autre colonne : pas de problème)

    C'est grave docteur ?
    On peut faire qq chose

    Merci pour votre aide ou suggestions ?



    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
     
     
     {
        public MetaRange activeRange;
        C_Document document;
     
        public FrmMetaRegio(C_Document document)
        {
          this.document = document; 
     
          InitializeComponent();
    //      fillDgv();
        }
     
        private void fillDgv()
        {
          dgv_lstMeta.DataSource = null;
          dgv_lstMeta.DataSource = ((MapDataProvider)this.document.DataProvider).MetaRanges;
          for (int i = 0; i < dgv_lstMeta.ColumnCount; i++)
          {
            dgv_lstMeta.Columns[i].Visible = false;
          }
          dgv_lstMeta.Columns["Name"].Visible = true;
          dgv_lstMeta.Columns["Value"].Visible = true;
          dgv_lstMeta.Columns["Value"].Width = 50;
     
     
          for (int i = 0; i < dgv_lstMeta.Rows.Count - 1; i++)
          {
            Color Kleur = (Color)dgv_lstMeta["Color", i].Value;
            dgv_lstMeta["value", i].Style.BackColor = Kleur;
          }
        }
        private void button1_Click(object sender, System.EventArgs e)
        {
          fillDgv();
        }
        private void FrmMetaRegio_Shown(object sender, System.EventArgs e)
        {
    //      fillDgv();
        }
     
     
      }

  2. #2
    Membre expérimenté
    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
    Par défaut
    Bonjour

    Pour ceux que ca intéresse, j'ai trouvé un contournement (c'est intuitif, mais je ne sais pas si c'est la meilleure methode)

    En pratique
    1- Dans l'event form Shown j'appele le bind du dgv
    2- Dand l'event BindingComplete j'appelle le traitement l'affichage du DGV



    Ca donne ceci et je n'ai plus de problème


    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
      public partial class FrmMetaRegion : Form
      {
     
        public MetaRange activeRange;
        C_Document document;
     
        public FrmMetaRegion(C_Document document)
        {
          this.document = document;
     
          InitializeComponent();
     
        }
        // ****************************************************************************
        private void fillDgv()
        {
          if (((MapDataProvider)this.document.DataProvider).ActiveLayer == null)
          {
            return;
          }
          dgv_lstMeta.DataSource = null;
          dgv_lstMeta.DataSource = ((MapDataProvider)this.document.DataProvider).MetaRanges;
     
        }
        // ****************************************************************************    
        private void displayDgv()
        {
          dgv_lstMeta.Columns["Value"].Width = 50;
          for (int i = 0; i < dgv_lstMeta.ColumnCount; i++)
          {
            dgv_lstMeta.Columns[i].Visible = false;
          }
          dgv_lstMeta.Columns["Name"].Visible = true;
          dgv_lstMeta.Columns["Value"].Visible = true;
     
     
          for (int i = 0; i < dgv_lstMeta.Rows.Count - 1; i++)
          {
            Color Kleur = (Color)dgv_lstMeta["Color", i].Value;
            dgv_lstMeta["value", i].Style.BackColor = Kleur;
          }
        }
        // ****************************************************************************
        private void dgv_lstMeta_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
          displayDgv();
        }
        // *************************************************************************
        private void FrmMetaRegion_FormClosing(object sender, FormClosingEventArgs e)
        {
          this.Dispose();
        }
        // *************************************************************************
        private void FrmMetaRegion_Shown(object sender, EventArgs e)
        {
          fillDgv();
        }
        // *************************************************************************
        protected override void OnPaintBackground(PaintEventArgs e)
        {
          Brush gradientBrush = new LinearGradientBrush(e.ClipRectangle, SystemColors.GradientActiveCaption, Color.WhiteSmoke, LinearGradientMode.BackwardDiagonal);
          e.Graphics.FillRectangle(gradientBrush, e.ClipRectangle);
        }
      }

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Tu peux gérer les évènements RowPrePaint ou CellPainting pour customiser la couleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    private void dgv_lstMeta_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs args)
    {
        dgv_lstMeta["value", e.RowIndex].Style.BackColor = (Color)dgv_lstMeta["Color", e.RowIndex].Value
    }

  4. #4
    Membre expérimenté
    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
    Par défaut
    AhHa

    Bon a savoir !

    Encore une bonne suggestion de TomLev

    Merci beaucoup

  5. #5
    Membre Expert Avatar de Guulh
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    2 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 2 160
    Par défaut
    En complément à ce qu'a écrit tomlev: afin d'avoir des perfs honorables, la DGV évite autant que possible d'instancier des DataGridViewCell, des DataGridViewCellStyle, etc. Elle ne le fait que si nécessaire, c'est à dire si tu écris explicitement grille[i, j].Style.Machin = bidule.

    Le plus propre et performant est de définir les styles au niveau de la colonne quand c'est possible, et sinon dans les event CellFormatting et / ou CellPainting selon le cas. Ces event ont un EventArgs avec une propriété "Style" que l'on peut modifier sans pour autant dégrader les perfs.

    Il y a un doc dans la MSDN, nommé datagridview FAQ ou un truc du genre, qui explique tout ça.

  6. #6
    Membre expérimenté
    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
    Par défaut
    Merci Guuhl

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Le plus propre et performant est de définir les styles au niveau de la colonne quand c'est possible,
    Dans mon cas sur une meme colonne je dois changer la couleurs des cellules donc je ne peux pas donner ma propriété au niveau de la colonne

    Par contre il est clair qu'utiliser l'event CellPainting serait plus judicieux que la boucle que j'effectue actuellement (ormis le fait qu'elle a l'avantage d'etre explicite)

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

Discussions similaires

  1. Appel d'un form paint
    Par pascb423 dans le forum VB.NET
    Réponses: 5
    Dernier message: 28/11/2014, 21h59
  2. Scintillement? sur Paint d'un DGV
    Par sibama dans le forum VB.NET
    Réponses: 10
    Dernier message: 18/12/2008, 08h30
  3. Positionnement sur une Cellule DGV et effet ombre de Form
    Par bellak dans le forum Windows Forms
    Réponses: 7
    Dernier message: 15/12/2008, 11h46
  4. jeu de platte forme 2D : comment gérer les collisions
    Par dawadam dans le forum Physique
    Réponses: 12
    Dernier message: 27/06/2008, 16h43
  5. [Gestion de formes 2D / 3D][Empilements et collisions]
    Par Théolude dans le forum Développement 2D, 3D et Jeux
    Réponses: 4
    Dernier message: 01/06/2007, 17h11

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