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 :

Assignation d'une image à un Cell.Value d'un DataGridView


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 6
    Par défaut Assignation d'une image à un Cell.Value d'un DataGridView
    Bonjour,

    Je cherche à afficher des icônes dans une colonne d'un DataGridView lié à un DataSet. Pour faire celà, j'ai appliqué la technique proposée dans "Comment : personnaliser la mise en forme des données dans le contrôle DataGridView":

    J'ajoute programmatiquement une colonne DataGridViewImageColumn au DataGridView et j'assigne une image à chaque cellule de cette colonne en fonction du contenu du DataRow dans DataGridView_CellFormatting.

    Le problème est que ceci donne lieu à un StackOverflowException juste sur la ligne où j'assigne une image à la valeur de la cellule. Le problème ne survient pas sur de petits datasets (200 lignes) mais de manière systématique sur de plus grands datasets (1000-2000 lignes). Remarquez que je charge les images depuis les resources.

    Le StackOverflowException signifie-t'il que les bitmaps sont dupliqués pour chaque DataRow, ce qui mène à l'overflow?
    Y-a-t'il une manière plus propre de travailler?

    Merci beaucoup d'avance pour toute aide ou commentaire.

    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
    public Form1()
    {
        InitializeComponent();
    
        ...
    
        circleGreenImage = MyAppNameSp.Properties.Resources.imr_CircleGreen_16;
        circleRedImage = MyAppNameSp.Properties.Resources.imr_CircleRed_16;
    }
    
    private void openToolStripButton_Click(object sender, EventArgs e)
    {
        ...
        
        // Bind dsStringDataSet to dataGridView
        dataGridView.DataSource = dsStringDataSet;
        dataGridView.DataMember = "string";
    
        // Add unbound column for displaying icons
        DataGridViewImageColumn imageColumn = new DataGridViewImageColumn();
        imageColumn.Name = "icon";
        imageColumn.HeaderText = "";
        dataGridView.Columns.Insert(2, imageColumn);
        
        ...
    }
    
    private void dataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        if (dataGridView.Rows.Count > 1)
        {
            if (dataGridView.Columns[e.ColumnIndex].Name.Equals("icon"))
            {
                DataGridViewCell iconCell = dataGridView["icon", e.RowIndex];
                iconCell.Style.NullValue = null;
                String stringValue = dataGridView[sTargetLangCodeTS, e.RowIndex].Value as string;
    
                switch (stringValue)
                {
                    case sTS_Translated:
                        iconCell.Value = circleGreenImage; // <<< StackOverflowException here
                        iconCell.ToolTipText = "Translated";
                        break;
                    case sTS_Untranslated:
                        iconCell.Value = circleRedImage;
                        iconCell.ToolTipText = "Untranslated";
                        break;
                    default:
                        iconCell.Value = null;
                        iconCell.ToolTipText = String.Empty;
                        break;
                }
            }
        }
    }

  2. #2
    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
    Hello,

    tu parles de cet article ?

    Si c'est le cas, tu constateras que l'image n'est pas affectée à la DataGridViewCell, mais au style de l'eventArgs e. (exemple : e.Value = trucMucheImage)

    Ce qui se passe, dans ton cas, je suppose, c'est qu'à chaque redessin, tu remodifies manuellement l'image associée à la cellule, ce qui l'invalide, nécessite un redessin, redéclenche l'event Formatting, ... => Stack overflow.

    En mode bindé (ton cas, donc, puisque ta grille est liée à un dataset), on manipule très peu les datagridviewrow, datagridviewcell, ... Si on veut personnaliser le dessin, il suffit de s'abonner aux event Formatting / Painting et modifier l'EventArgs.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2009
    Messages : 6
    Par défaut
    Oui, tout-à-fait. C'est bien cet article.

    Et un grand merci pour ton explication très claire. Cela marche sans problème maintenant que j'affecte l'image au style de l'eventArgs e.

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

Discussions similaires

  1. Rafraichir une image lorsque celle-ci est survolée
    Par prgasp77 dans le forum jQuery
    Réponses: 3
    Dernier message: 22/09/2010, 01h13
  2. Réponses: 2
    Dernier message: 11/12/2009, 16h23
  3. comment mettre une image dans une liste avec les values ?
    Par Ekimasu dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 15/05/2007, 17h51
  4. Assigner une image à un controle image
    Par Rumeurs dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 19/04/2007, 18h52
  5. Comment assigner un evenement a une image?
    Par nooblender dans le forum SDL
    Réponses: 10
    Dernier message: 29/08/2006, 11h18

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