Impression d'un tableau pb hauteur des cellules

Résolu
julienorion666 Messages postés 38 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 24 juin 2008 - 20 févr. 2008 à 13:55
julienorion666 Messages postés 38 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 24 juin 2008 - 20 févr. 2008 à 19:44
Bonjour,

Je fait de l'impression d'un tableau de 3 colonnes , je mesure la taille de mon text pour calculer la hauteur de ma cellule ou plutot de la ligne.
float largeur_co;
for (int i = 0; i < listViewCarr.Items.Count; i++)
{
// taille des chaine a mettre ds les 3 cellules
float tailleDomaine = e.Graphics.MeasureString(listViewCarr.Items[i].SubItems[0].Text ,imprFont).Width;
float tailleProfession = e.Graphics.MeasureString(listViewCarr.Items[i].SubItems[1].Text, imprFont).Width;
float tailleSecteur = e.Graphics.MeasureString(listViewCarr.Items[i].SubItems[2].Text , imprFont).Width;

// taille du text le plus grand
float tailleMax = Math.Max(Math.Max(tailleDomaine, tailleProfession), tailleSecteur);

//largeur des colonnes
largeur_col =  e.MarginBounds.Width/3

// taille d'une ligne text
int hauteur = (int)MyGr.MeasureString("X", imprFont).Height;

// nombre de lignes text
int nb_lignes_txt = (int) (tailleMax / largeur_col) + 1;

//hauteut de ma ligne
hauteur = hauteur * nb_lignes_txt

tableCase = new Rectangle(0, Ypos, largeur_col, hauteur);
e.Graphics.DrawString(listViewCarr.Items[i].SubItems[0].Text, imprFont, imprBrush, tableCase, imprFormat);
e.Graphics.DrawRectangle(stylo, tableCase);

tableCase = new Rectangle(xBase + largeur_col, Ypos, largeur_col, hauteur);
e.Graphics.DrawString(listViewCarr.Items[i].SubItems[1].Text, imprFont, imprBrush, tableCase, imprFormat); e.Graphics.DrawRectangle(stylo, tableCase);

tableCase = new Rectangle(xBase + largeur_col*2, Ypos, t largeur_col, hauteur);
e.Graphics.DrawString(listViewCarr.Items[i].SubItems[2].Text, imprFont, imprBrush, tableCase, imprFormat);
e.Graphics.DrawRectangle(stylo, tableCase);

Ypos += hauteur;
}


le probleme c'est que dans certain cas ma varaible "nb_lignes_txt" n'est pas exacte 1.9... au lieu 2.0124. et il me manque donc une ligne et il coupe, je ne vois pas ou est l'erreur de calcul.

peut etre a cause des blanc qu'il rajoute dans la mise en forme:

"il fait beau ce matin" :21 caractere

il fait beau ce __
matin_________ : 32 caractere.

mais si c est ca comment mesurer la taille du text mise en forme a la fin. :heink:

4 réponses

oximoron Messages postés 149 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 30 janvier 2009
20 févr. 2008 à 17:50
tu peut être arrondir à l'entier supérieur avec un Math.Ceiling(), moi c'est ce que j'avais fait, il vaut mieux avoir de l'espace perdu que des données perdues. la fonction MeasureString est parfois assez étrange et son fonctionnment obscure.
3
oximoron Messages postés 149 Date d'inscription mercredi 23 juillet 2003 Statut Membre Dernière intervention 30 janvier 2009
20 févr. 2008 à 19:31
je chipote un peu mais Math.Ceiling() c est pas pareil que le +1 tout bêtement car si quun reprend ton code c'est sera toute de suite logique que c'est l'entier supérieur et que c'est pas un +1 mis la car sinon ca marhce pas. Imagine je dois débugger ton code : je vois le +1 mais (par ex 2.98 + 1 = 3.98) donc je vais me demander si je dois encore l'arrondir ou pas. Je dis ca parce que j'ai vu du code ou il y a des +2 voir des +3 tu ne sais pas pourquoi. Donc dans le fonctionnement c'est logique, dans le principe c'est moins bon ;)
3
julienorion666 Messages postés 38 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 24 juin 2008
20 févr. 2008 à 18:39
c est bon j'ai trouve dans un tutoriel.

C est bien les espace qu il rajoute apres ds la cellule

je mesure une chaine elle a une taille x.
quand je la met ds une cellule a cause des saut de lignes qui cree des blanc sa taille va augmenter.

il faut faire comme ceci :
[cpp]
hauteur = (int)e.Graphics.MeasureString(strMax, imprFont, largeur_col).Height;
/cpp
strMax : chaine la plus grande des 3.

nb:pour Math.Ceiling() c est pareil que le +1

nb_lignes_txt = (int) (tailleMax / largeur_col) + 1
nb_lignes_txt = (int)Math.Ceiling(tailleMax / largeur_col_max);
c est pareil
0
julienorion666 Messages postés 38 Date d'inscription vendredi 6 juillet 2007 Statut Membre Dernière intervention 24 juin 2008
20 févr. 2008 à 19:44
faire une division entier avec un plus 1 c est un basique de la programmation, apres c est sur c est bien d avoir des methode qui le fond mais c est pas moin propre.
0
Rejoignez-nous