ComboBox et DropDownWidth

Résolu
brice_nice Messages postés 29 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 12 juin 2006 - 5 avril 2005 à 09:48
brice_nice Messages postés 29 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 12 juin 2006 - 5 avril 2005 à 16:33
Bonjour,
Je voudrais savoir comment je peux récupérer la largeur du plus long de mes items dans une combobox, pour pouvoir définir ensuite DropDownWidth (la largeur de la liste déroulante) ?

En vous remerciant !

12 réponses

cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
5 avril 2005 à 10:17
Salut,
Et si tu parlais de la largeur en pixels, sert toi de MeasureString.

Cocoricoooooooo !!!!
coq
MVP Visual C#
3
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
5 avril 2005 à 12:40
Ah donc c'est bien du OwnerDraw, donc oui il vaut mieux que tu te server de DrawItem, c'est là que tu vas dessiner tes items :-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
3
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
5 avril 2005 à 10:08
int i = 0;


foreach(object o in comboBox1.Items)


if(o.ToString().Length > i) i = o.ToString().Length;
Mx
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
5 avril 2005 à 10:42
Ah bah oui, jsuis bete

Mx
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
brice_nice Messages postés 29 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 12 juin 2006
5 avril 2005 à 12:09
Oui je parlais bien de la mesure en pixel !
Je me suis servi d'un bout de code que tu avais fait coq, mais depuis il ne m'affiche plus rien dans ma combobox, enfin si c'est comme s'il affichait les items en blanc !
Voici le bout de code : (est-on obligé de se servir de DrawItem, pour l'instant je ne m'en sers pas)

private
void cboAuthors_MeasureItem(
object sender, System.Windows.Forms.MeasureItemEventArgs e)


{



if ( e.Index != -1 )


{


ComboBox combo = (ComboBox)sender;


SizeF temp;



string item = combo.Items[e.Index].ToString();


temp = e.Graphics.MeasureString(item, combo.Font);



if ( temp.Width > max_largeur-max_largeur_ajout )


max_largeur = temp.Width+max_largeur_ajout;



if ( temp.Height > max_hauteur )


max_hauteur = temp.Height;


e.ItemHeight = (
int)max_hauteur;


e.ItemWidth = (
int)max_largeur;


combo.DropDownWidth = (
int)max_largeur;


}


}
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
5 avril 2005 à 12:19
Euh, tu le sors de quel post ce bout de code là, je ne m'en souviens pas trop lol

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
brice_nice Messages postés 29 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 12 juin 2006
5 avril 2005 à 12:30
Désolé, c'était ce post là :
http://www.csharpfr.com/forum.v2.aspx?ID=269098
0
brice_nice Messages postés 29 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 12 juin 2006
5 avril 2005 à 14:26
Merci coq !

Ca marche un peu mieux mais maintenant, les deux champs qui forment le contenu de mon Combobox se chevauchent et c'est illisible ! Et lorsque je sélectionne un item il ne m'affiche que le premier champ !
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
5 avril 2005 à 14:39
Comment ça ils se chevauchent ?

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
brice_nice Messages postés 29 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 12 juin 2006
5 avril 2005 à 14:50
Eh bien par exemple si j'ai deux valeurs de champs, l'une étant 44000 et l'autre Nantes, alors Nantes est écrit sur 44000 donc c illisible, mais je crois que j'ai trouvé il y a un problème au niveau de :

RectangleF bounds = e.Bounds;


bounds.X = bounds.Width - max_largeur_fin;


e.Graphics.DrawString(fin,e.Font,brushTexte,bounds,format);

car je trouve bounds.X égale à -95 !

Merci à toi Maître Coq !
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
5 avril 2005 à 14:57
Oui apparement il y a quelque chose qui cloche au niveau des calculs de position.
Au pire attend Arthenius, il connait ce genre de chose je crois maintenant ;-)

Cocoricoooooooo !!!!
coq
MVP Visual C#
0
brice_nice Messages postés 29 Date d'inscription vendredi 11 février 2005 Statut Membre Dernière intervention 12 juin 2006
5 avril 2005 à 16:33
Voilà comment j'ai modifié mon code pour que cela marche :



private
float max_largeur = 0.0f;



private
float max_hauteur = 0.0f;



private
const
int max_largeur_ajout = 10;



private
float max_largeur_debut = 0.0f;



private
void cb1_MeasureItem(
object sender, System.Windows.Forms.MeasureItemEventArgs e)


{



if ( e.Index != -1 )


{


ComboBox combo = (ComboBox)sender;


SizeF temp;



//string item = combo.Items[e.Index].ToString();



string item = ((AddValue)combo.Items[e.Index]).Display.ToString();


temp = e.Graphics.MeasureString(item, combo.Font);



if ( temp.Width > max_largeur-max_largeur_ajout )


max_largeur = temp.Width+max_largeur_ajout;



if ( temp.Height > max_hauteur )


max_hauteur = temp.Height;



// mesure de la chaine de debut



string debut = item.Substring(0,item.IndexOf(' '));


temp = e.Graphics.MeasureString(debut, combo.Font);



if ( temp.Width > max_largeur_debut)


max_largeur_debut= temp.Width;


e.ItemHeight = (
int)max_hauteur;


e.ItemWidth = (
int)max_largeur;


combo.DropDownWidth = (
int)max_largeur;


}


}



private
void cb1_DrawItem(
object sender, System.Windows.Forms.DrawItemEventArgs e)


{



if ( e.Index != -1 )


{


ComboBox combo = (ComboBox)sender;



string item = ((AddValue)combo.Items[e.Index]).Display.ToString();



string debut, fin;


debut = item.Substring(0, item.IndexOf(' '));


fin = item.Substring(item.IndexOf(' ')+1);



// dessin


StringFormat format =
new StringFormat();



// fond


SolidBrush brushFond, brushTexte;



// si item sélectionné



if ( ( e.State & DrawItemState.Selected ) == DrawItemState.Selected )


{



// inversion des couleurs


brushFond =
new SolidBrush(e.ForeColor);


brushTexte =
new SolidBrush(e.BackColor);


}



else


{


brushFond =
new SolidBrush(e.BackColor);


brushTexte =
new SolidBrush(e.ForeColor);


}



// fond


e.Graphics.FillRectangle(brushFond, e.Bounds);



// rectangle de sélection si sélection



if ( ( e.State & DrawItemState.Selected ) == DrawItemState.Selected )


e.DrawFocusRectangle();



// debut


format.Alignment = StringAlignment.Near;


e.Graphics.DrawString(debut,e.Font,brushTexte,e.Bounds,format);



// fin


RectangleF bounds = e.Bounds;



// 10 est l'écart qu'il y aura entre les deux champs


bounds.X = max_largeur_debut+10;


e.Graphics.DrawString(fin,e.Font,brushTexte,bounds,format);


}


}
0
Rejoignez-nous