Touver le nom de fichier le plus long

Résolu
Toxic64 Messages postés 13 Date d'inscription jeudi 13 novembre 2008 Statut Membre Dernière intervention 25 juin 2009 - 3 déc. 2008 à 21:43
Toxic64 Messages postés 13 Date d'inscription jeudi 13 novembre 2008 Statut Membre 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....

6 réponses

SharpMao Messages postés 1024 Date d'inscription mardi 4 février 2003 Statut Membre Dernière intervention 7 juin 2010 69
4 déc. 2008 à 07:00
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)
3
WishhhMaster Messages postés 327 Date d'inscription mardi 17 février 2004 Statut Membre Dernière intervention 10 avril 2010 8
4 déc. 2008 à 07:28
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.
3
nhervagault Messages postés 6063 Date d'inscription dimanche 13 avril 2003 Statut Modérateur Dernière intervention 15 juillet 2011 37
4 déc. 2008 à 10:52
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
3
Toxic64 Messages postés 13 Date d'inscription jeudi 13 novembre 2008 Statut Membre Dernière intervention 25 juin 2009
4 déc. 2008 à 19:46
ca scintillait effectivement.
depuis hier soir j ai corrigé.

en detectant l'ouverture de la liste je desactive le survol du bouton.
0

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

Posez votre question
Toxic64 Messages postés 13 Date d'inscription jeudi 13 novembre 2008 Statut Membre Dernière intervention 25 juin 2009
4 déc. 2008 à 19:47
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.
0
Toxic64 Messages postés 13 Date d'inscription jeudi 13 novembre 2008 Statut Membre Dernière intervention 25 juin 2009
4 déc. 2008 à 19:48
Trés bonne info mais la c'est d un tout autre niveau pour moi , je vais essayer cela aussi.
merci pour les conseils....
0