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

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

6 réponses

Répondre au sujet
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 4 déc. 2008 à 07:00
+3
Utile
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)
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de SharpMao
WishhhMaster 327 Messages postés mardi 17 février 2004Date d'inscription 10 avril 2010 Dernière intervention - 4 déc. 2008 à 07:28
+3
Utile
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.
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de WishhhMaster
nhervagault 6069 Messages postés dimanche 13 avril 2003Date d'inscription 15 juillet 2011 Dernière intervention - 4 déc. 2008 à 10:52
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de nhervagault
Toxic64 13 Messages postés jeudi 13 novembre 2008Date d'inscription 25 juin 2009 Dernière intervention - 4 déc. 2008 à 19:46
0
Utile
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
Toxic64 13 Messages postés jeudi 13 novembre 2008Date d'inscription 25 juin 2009 Dernière intervention - 4 déc. 2008 à 19:47
0
Utile
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
Toxic64 13 Messages postés jeudi 13 novembre 2008Date d'inscription 25 juin 2009 Dernière intervention - 4 déc. 2008 à 19:48
0
Utile
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.