Dessin dans une cellule d'un DataGridView

Signaler
Messages postés
80
Date d'inscription
jeudi 2 février 2006
Statut
Membre
Dernière intervention
24 mai 2007
-
Messages postés
80
Date d'inscription
jeudi 2 février 2006
Statut
Membre
Dernière intervention
24 mai 2007
-
Bonjour

Je vous explique mon problème.

J'ai une forme qui contien un tab control, chaque onglet représente un jour de la semaine, dans cet onglet on retrouve un datagridview qui contient des horaires, une colonne "Début", une colonne "Fin" et une colonne contenant un dessin représentant un intervale de temps (un rectangle avec dessiné dedans l'intervale par de petit rectangles coloré "un time barre" si vou préférez.

Quand le DataGridView contient qu'un seul horaire pas de soucis le timeBarre représente bien l'horaire indiqué.

Par contre quand il en contient plusieurs la il affiche dans la cellule concerné de chaque ligne tout les horaires de chaque ligne (une sorte de résumé de chaque chaque ligne)

Pour faire ce dessin j'ai utilsé l'événement CellPainting dont voici le code :

private void dataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
Color color1 = new Color();
Color color2 = new Color();

color1 = Color.Orange;
color2 = Color.OrangeRed;

if (this.dgvSelected.Columns[ColumnName].Index ==
e.ColumnIndex && e.RowIndex >= 0)
{

Rectangle newRect = new Rectangle(e.CellBounds.X + 1, e.CellBounds.Y +
2, e.CellBounds.Width - 4, e.CellBounds.Height - 6);

using (Brush gridBrush = new SolidBrush(Color.Black),
backColorBrush = new SolidBrush(e.CellStyle.BackColor))
{
using (Pen gridLinePen = new Pen(gridBrush))
{
// Efface la cellule.
e.Graphics.FillRectangle(backColorBrush, e.CellBounds);

// Dessine les lignes du grid
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Left,
e.CellBounds.Bottom - 1, e.CellBounds.Right - 1,
e.CellBounds.Bottom - 1);
e.Graphics.DrawLine(gridLinePen, e.CellBounds.Right - 1,
e.CellBounds.Top, e.CellBounds.Right - 1,
e.CellBounds.Bottom);

// Dessine le rectangle dans la cellule.
e.Graphics.DrawRectangle(Pens.Black, newRect);

//Pour Chaques lignes de dgvSelected
foreach (DataGridViewRow r in dgvSelected.Rows)
{
x0 = newRect.X;
y0 = newRect.Y;

// Si les champs Debut et Fin sont pas vides
if ((r.Cells[ColumnDebut].Value != null) &&
(r.Cells[ColumnFin].Value != null))
{
debut = (DateTime)r.Cells[ColumnDebut].Value;
fin = (DateTime)r.Cells[ColumnFin].Value;

//On définit les point de débuts
ptDebut.X = (System.Convert.ToInt16(debut.Hour) * 60
+ System.Convert.ToInt16(debut.Minute)) / 6 + x0;
ptDebut.Y = y0 + 1;

//Définition des points de fin
ptFin.X = (System.Convert.ToInt16(fin.Hour) * 60 +
System.Convert.ToInt16(fin.Minute)) / 6 + x0;
ptFin.Y = y0 + 1;

//On définit la largeur et la hauteur du rectangle à
remplir représentant l'écart Horaire
_width = ptFin.X - ptDebut.X;
_height = newRect.Height;

if (_width > 0)
{
if ((color1 == Color.DarkRed)
&& (color2 == Color.Red))
{
color1 = Color.Orange;
color2 = Color.OrangeRed;
Rectangle rectTemps = new
Rectangle(ptDebut.X, ptDebut.Y, _width,
_height);
LinearGradientBrush gradientBrush = new
LinearGradientBrush(rectTemps, color1,
color2, LinearGradientMode.Vertical);

e.Graphics.FillRectangle(gradientBrush,
rectTemps);

}
if ((color1 == Color.Orange)
&& (color2 == Color.OrangeRed))
{
color1 = Color.DarkRed;
color2 = Color.Red;
Rectangle rectTemps = new
Rectangle(ptDebut.X, ptDebut.Y, _width,
_height);
LinearGradientBrush gradientBrush = new
LinearGradientBrush(rectTemps, color1,
color2, LinearGradientMode.Vertical);

e.Graphics.FillRectangle(gradientBrush,
rectTemps);
}
}
}
}



e.Handled = true;
}
}
}
}


Voilà désolé pour la lourdeur du code (j'aime indenté lol)

Si vous savez méclairé merci

Z.

1 réponse

Messages postés
80
Date d'inscription
jeudi 2 février 2006
Statut
Membre
Dernière intervention
24 mai 2007

Y'a personne qui a fait ça de sa vie ? :p