Touver le nom de fichier le plus long [Résolu]

Messages postés
13
Date d'inscription
jeudi 13 novembre 2008
Dernière intervention
25 juin 2009
- - Dernière réponse : Toxic64
Messages postés
13
Date d'inscription
jeudi 13 novembre 2008
Dernière intervention
25 juin 2009
- 4 déc. 2008 à 19:48
Bonjour,

Je suis un nouveau venu dans le domaine du développement et j'ai choisi C# pour débuter...

projet ambitieux pour commencé, j'ai décidé de faire un chat en winform. mais je rencontre un problème dans une listview.

Voici le code qui me pose un problème:











private





void

Userlistbut_MouseHover_1(


object

sender,


EventArgs

e)   {

      Usrselectlist.Visible =



true

;      Usrselectlist.Focus();



      string

FilePath =


ConfigurationManager

.AppSettings[


"UserFilePath"

];



      string

[] UsrlistFiles = System.IO.


Directory

.GetFiles(FilePath);



      ListViewItem

Ulvi =


null

;



            foreach

(


string

Usr


in

UsrlistFiles)               {

                     System.IO.



FileInfo

fi =


new

System.IO.


FileInfo

(Usr);                     Ulvi =



new





ListViewItem

();                     Ulvi.Text = System.IO.



Path

.GetFileNameWithoutExtension(fi.Name);                     Ulvi.Tag = fi.FullName;

                      Ulvi.ImageIndex = 2;

                      Usrselectlist.Scrollable =



false

;                      Usrselectlist.Width = fi.Name.Length ;



                      int

listwidth fi.Name.Length;                      Usrselectlist.Width listwidth * 10;



                                 if

(Usrselectlist.Items.Count >= 1);                                       {



                                                int

listlength Usrselectlist.Items.Count;                                                Usrselectlist.Height 19 * listlength;









                                       }

















                         Usrselectlist.Items.Add(Ulvi);




      }


Le problème est le suivant:

Comme vous l'aurez compris, la listview n'est volontairement pas scrollable.
sa longueur s'adapte au nombre de fichiers presents dans le "Userfilepath"(defini dans appconfig). (un peu de logique mathematique)
J'aurais voulu faire de meme pour la largeur mais pour cela , il me faut determiner le nom de fichier le plus long dans cette liste
et c'est la que le problème se pose.
dans l'etat actuel des choses, si j ai un nom de fichier de 3 lettres, la largeur est 30px (la ca va encore)si j ai un nom de fichier de 25 lettres, j'ai une largeur de 250px ( et la ca va plus du tout....)

Comment faire pour trouver le nom de fichier le plus long afin de definir la largeur de la listview?

PS: Je sais que c'est le bordel dans mon code..... si vous avez des remarques ou des conseils, je suis preneur pour ca aussi....
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
3
Merci
Hello,

Ce n'est pas compliqué, tu va voir.

Premièrement, crée une variable avant ta bloucle foreach :

int maxLength=0;//mettre une autre valeur si tu veux une largeur minimale.

ensuite, dans ta boucle, tu mets la ligne suivante :

maxLength = fi.Name.Length>maxLength ? fi.Name.Length : maxLength;

Je ne sais pas si tu connais cette notation A?B:C, mais ça veut dire si A, retourne B, autrement C.
Une fois que tu auras terminé ta boucle, tu auras le nombre de caractères maximum.
Ton code n'est pas si bordélique. J'ai vu bien pire fait par des gens qui se prétendent professionnels.
Par contre, tu peux exécuter toute cette partie du code après ta boucle, il est inutile de le refaire à chaque fois :

Usrselectlist.Scrollable = false ;

Usrselectlist.Width = maxLength * 10;

if (Usrselectlist.Items.Count >= 1);{

    Usrselectlist.Height = 19 * Usrselectlist.Items.Count;

}

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de SharpMao
Messages postés
327
Date d'inscription
mardi 17 février 2004
Dernière intervention
10 avril 2010
3
Merci
Salut,

Evite de mettre des choses qui ne servent à rien ou se répète dans ta boucle for. Par exemple,

Usrselectlist.Width = fi.Name.Length ;
                      int listwidth fi.Name.Length;                      Usrselectlist.Width listwidth * 10;

la première instruction ne sert à rien.
Pour la hauteur de la liste, pourquoi la redimensionner à chaque passage? Sors le code de la boucle for.
Pareil pour Usrselectlist.Scrollable = false
;

Sinon, pour répondre à ta question, tu peux mesurer la longueur de chaque item de ta liste et ainsi déterminer la chaine la plus longue. Utilise ça pour mesurer.  Compter le nombre de caractères des items n'est pas assez, car les caractères peuvent avoir différentes largeurs.

Mets ça après ta boucle for:

Graphics g = Graphics.FromHwnd(Usrselectlist.Handle);
            float maxLen = 0;
            foreach (ListViewItem lvi in Usrselectlist.Items)
            {
                SizeF s = g.MeasureString(lvi.Text, Usrselectlist.Font);
                if (s.Width > maxLen)
                    maxLen = s.Width;
            }
Usrselectlist.Width = (int)maxLen;

(tu auras besoin d'include System.Drawing)

Tu pourrais même mesurer les chaînes dans la première boucle for pour ne pas avoir à faire un 2e passage.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de WishhhMaster
Messages postés
6069
Date d'inscription
dimanche 13 avril 2003
Dernière intervention
15 juillet 2011
3
Merci
Salut

Ca dois sintiller ton programme ??

Il faut évite de mettre du code
dans les evenements de la souris cet evenement est lancé a chaque fois que ta souris passe sur le control
(heureusement que tu n'attaques pas une base de données tu la mettrais par terre :-) avec des requetes toutes les x secondes

Userlistbut_MouseHover

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 96 internautes nous ont dit merci ce mois-ci

Commenter la réponse de nhervagault
Messages postés
13
Date d'inscription
jeudi 13 novembre 2008
Dernière intervention
25 juin 2009
0
Merci
ca scintillait effectivement.
depuis hier soir j ai corrigé.

en detectant l'ouverture de la liste je desactive le survol du bouton.
Commenter la réponse de Toxic64
Messages postés
13
Date d'inscription
jeudi 13 novembre 2008
Dernière intervention
25 juin 2009
0
Merci
Je ne connaissait pas cette syntaxe.je vais essayer ca des ce soir...
en tout cas merci pour cette reponse qui en plus de résoudre mon problème ajoute a mes connaissances.
Commenter la réponse de Toxic64
Messages postés
13
Date d'inscription
jeudi 13 novembre 2008
Dernière intervention
25 juin 2009
0
Merci
Trés bonne info mais la c'est d un tout autre niveau pour moi , je vais essayer cela aussi.
merci pour les conseils....
Commenter la réponse de Toxic64

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.