10
votes

Comment afficher une image dans une en-tête de colonne DataGridView?

au moment de l'exécution, j'ajoute un DataGridView code> à un formulaire Windows. La colonne finale est un datagridViewimagecolumn code>: xxx pré>

Ajout du code suivant obtiendra mon icône d'informations (bitmap) à afficher dans chacune des cellules de colonne mais pas l'en-tête de la colonne : p> xxx pré>

En outre, il convient de noter que l'image affiche "parfaitement" dans les cellules, c'est-à-dire qu'elle est correctement adaptée à la cellule. P>

Cependant , Je ne trouve pas un moyen d'ajouter la même image à la cellule d'en-tête de colonne. Après une certaine google, j'ai utilisé le code suivant qui a placé l'image dans la cellule d'en-tête mais m'a laissé deux problèmes: p>

  1. L'image n'a pas "la taille automatique" à la tête de la colonne de la même manière qu'elle l'a fait lorsqu'il est ajouté aux cellules de colonne. L'image était légèrement plus grande et floue. Li>
  2. En utilisant les performances code> _Cellpainting CODE> Événement a ralentis I.e. Lorsque vous planez sur le DataGridView CODE> pour mettre en surbrillance la ligne sélectionnée La mise en surbrillance à la traîne de l'endroit où ma souris a été placée. Li> ol>

    Voici le code: P>

    Private Sub MyDataGridView_CellPainting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles MyDataGridView.CellPainting
       Dim InfoIcon As Image = Image.FromFile("C:\MyPath\InfoIcon.bmp")
       If e.RowIndex = -1 AndAlso e.ColumnIndex = MyDataGridView.Columns.Count - 1 Then
           e.Paint(e.CellBounds, DataGridViewPaintParts.All And Not   DataGridViewPaintParts.ContentForeground)
           e.Graphics.DrawImage(InfoIcon, e.CellBounds)
           e.Handled = True
        End If
    End Sub
    


0 commentaires

4 Réponses :


16
votes

Une manière dont vous pouvez le faire consiste à utiliser l'événement CellspSparting CODE> pour dessiner le bitmap pour une cellule d'en-tête particulière. Voici le code qui fait cela En supposant que le bitmap soit dans un imageur code>.

//this.images is an ImageList with your bitmaps
void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
    if (e.ColumnIndex == 1 && e.RowIndex == -1)
    {
        e.PaintBackground(e.ClipBounds, false);

        Point pt = e.CellBounds.Location;  // where you want the bitmap in the cell

        int offset = (e.CellBounds.Width - this.images.ImageSize.Width) / 2;
        pt.X += offset;
        pt.Y += 1;
        this.images.Draw(e.Graphics, pt, 0);
        e.Handled = true;
    }
}


2 commentaires

Dans le cas où vous ne stockez pas l'image dans un imageur, modifier le 2ème dernier LOC à; e.graphics.drawimage (image, pt); travaille aussi.


Cela fonctionne mais comment puis-je placer l'image par le côté du texte avec un peu de remplissage?



0
votes

Essayez ce code: xxx

Si vous avez lu l'article complet pour faire ce lien Vérifiez ce lien:

http://www.authorcode.com/add-image-on-DataGridView-Column-header- in-vb-net /


0 commentaires

2
votes

J'ai besoin d'une chose un peu plus complexe - Ajout d'une image devant le texte dans quelques-en-têtes de colonne en ce qui concerne l'alignement de la colonne.

Vous devez implémenter votre propre system.windows.forms.dataGridViewColumnheadercell code > et remplacer ColonneHeeCell CODE>: P>

protected override Size GetPreferredSize( Graphics graphics, DataGridViewCellStyle cellStyle, int rowIndex,Size constraintSize )
{
    // Load up original image
    Size original = base.GetPreferredSize( graphics, cellStyle, rowIndex, constraintSize );

    // Ensure the image is set and that we are working on header
    if ((rowIndex != -1) || (Image == null)) {
        return original;
    }

    // -1 is reserved value
    if (original.Width < 0) {
        return original;
    }
    return new Size( original.Width + Image.Width + 4, original.Height );
}


4 commentaires

Peut-on ajouter un contrôle du panneau juste au-dessus des en-têtes de colonne DataGridView ?


@Khurramali, je n'ai jamais testé / essayé ça ... Je pense que cela devrait être possible ... Si vous arrivez à le tester, laissez-moi savoir si cela a fonctionné.


@Vyktor DataGridviewColumn n'a pas de propriété de propriété de propriétéCell. Pouvez-vous clarifier?


@ user3700562 selon DataGridViewColumn Le coffre-tête est disponible depuis 2,0 . Mais il note également que c'est [browsharettribute (false)] vous êtes donc pas capable de le voir dans designer (mais doit le changer de manière programmatique).



1
votes

Essayez ceci:

Private Sub DataGridView1_CellPainting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellPaintingEventArgs) Handles DataGridView1.CellPainting
        If e.RowIndex > -1 Then

            If e.ColumnIndex = -1 Then
                e.Paint(e.CellBounds, DataGridViewPaintParts.Focus And Not DataGridViewPaintParts.ContentForeground)
                DataGridView1.RowHeadersBorderStyle = DataGridViewHeaderBorderStyle.Single
                e.Graphics.DrawImage(IconImg, e.CellBounds)
                e.Handled = True
                'DataGridView1.RowHeadersWidth = 100
                'DataGridView1.ColumnHeadersHeight = 25
            End If

        End If


1 commentaires

Vous devriez expliquer ce que vous faites. J'ai eu de la chance d'avoir essayé votre code depuis E.paint (E.Cellbounds, DataGridViewPaintParts.focus et non DataGridViewPaintPartparts.ContentFore) était exactement ce que je cherchais.