IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[C#] ImageList et Listview


Sujet :

Windows Forms

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 25
    Points
    25
    Par défaut [C#] ImageList et Listview
    Bonjour ! Soit le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    	void BTAjouterClick(object sender, System.EventArgs e)
    		{
    			ImageList1 = new ImageList();
    		        ImageList1.ImageSize = new Size(50,50);
    		  	for(int i=0;i<checkedListBox1.CheckedItems.Count;i++)
    				{
     				ImageList1.Images.Add(Image.FromFile(UrlEncours+"\\"+checkedListBox1.CheckedItems[i]));
     				MessageBox.Show(UrlEncours+"\\"+checkedListBox1.CheckedItems[i]);
     				listView1.Items.Add(checkedListBox1.CheckedItems[i].ToString()).ImageIndex=i;
     
    				}  
    			listView1.LargeImageList = ImageList1;
    Au premier click c'est nikel, mais aux click suivant, l'image affichée est la premiere qui à été affichée. J'ai essayé ImageList1.Images.Clear(); mais ca ne résoud rien. Quelqu'un aurait une idée ?
    Par avance merci

  2. #2
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    Ce n'est peut-être pas le bon Clear() que tu as essayé...

    Vois plutôt avec un listView1.Items.Clear().

    Cela dit, je ne suis pas sûr de bien comprendre ce que tu cherches à faire :
    • Ton code indique que tu voudrais afficher dans la ListView les images sélectionnées via la CheckedList
    • Mais le nom de ton bouton ("ajouter"), ton commentaire concernant "l'image affichée" (--> singulier), et le fait que j'ai été incapable de reproduire le problème que tu décris semblent indiquer autre-chose...

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    effectivement je n'ai pas été claire !
    Suite à la selection dans la checkedBoxList, le listview se remplit avec les images apropriées. Lorsque l'on click une deuxieme fois , le nouveau item s'ajoute a la listView mais toutes les images precedement ajoutés sont modifiées. Je veux simplement ajouter de nouveaux item sans modifier les précédents...
    Items.Clear() vide le listview alors que je veux ajouter de nouveaux items.

  4. #4
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    Donc, même si l'utilisateur décoche une image dans la CheckedListBox avant d'appuyer sur le bouton, elle doit rester dans la ListView ?
    Dans ce cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    		private void BTAjouter_Click(object sender, EventArgs e)
    		{
    			ImageList ImageList1 = (listView1.LargeImageList != null && listView1.LargeImageList.Images.Count > 0)
    				? listView1.LargeImageList
    				: new ImageList();
    			ImageList1.ImageSize = new Size(50, 50);
     
    			for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++)
    			{
    				string imageKey = checkedListBox1.CheckedItems[i].ToString();
    				if (!ImageList1.Images.ContainsKey(imageKey))
    				{
    					ImageList1.Images.Add(imageKey, Image.FromFile(UrlEncours+"\\"+checkedListBox1.CheckedItems[i])); 
    					listView1.Items.Add(imageKey, ImageList1.Images.IndexOfKey(imageKey));
    				}
    			}
     
    			listView1.LargeImageList = ImageList1;
    		}

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    Oui c'est exactement ce que je cherche à faire, mais il semble que votre réponse dépace mes connaissances !

    - que signifi le ? dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ? listView1.LargeImageList: new ImageList();
    - d'autre part j'ai des erreurs à la compilation sur ces 3 lignes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     if (!ImageList1.Images.ContainsKey(imageKey)) 
                { 
                   ImageList1.Images.Add(imageKey, Image.FromFile(UrlEncours+"\\"+checkedListBox1.CheckedItems[i])); 
                   listView1.Items.Add(imageKey, ImageList1.Images.IndexOfKey(imageKey)); 
                }
    MainForm.cs(514,18): error CS0117: 'System.Windows.Forms.ImageList.ImageCollection' ne contient pas de définition pour 'ContainsKey'
    MainForm.cs(516,16): error CS1502: La méthode surchargée correspondant le mieux à 'System.Windows.Forms.ImageList.ImageCollection.Add(System.Drawing.Image, System.Drawing.Color)' possède des arguments non valides
    MainForm.cs(516,38): error CS1503: Argument '1'*: impossible de convertir de 'string' en 'System.Drawing.Image'
    MainForm.cs(516,48): error CS1503: Argument '2'*: impossible de convertir de 'System.Drawing.Image' en 'System.Drawing.Color'
    MainForm.cs(517,46): error CS0117: 'System.Windows.Forms.ImageList.ImageCollection' ne contient pas de définition pour 'IndexOfKey'


  6. #6
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    que signifi le ? dans la ligne
    C'est l'opérateur ternaire.
    Juste une autre façon d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if (listView1.LargeImageList != null && listView1.LargeImageList.Images.Count > 0) 
    {
                ImageList ImageList1 =  listView1.LargeImageList;
    }
    else
    {
                ImageList ImageList1 = new ImageList();
    }
    - d'autre part j'ai des erreurs à la compilation sur ces 3 lignes
    Quel est la version du framework utilisé ? 1.1 ?
    J'utilise la version 2.0 et la méthode ContainsKey(string key) ainsi que la surcharge ImageCollection.Add(string key, Image image) y sont des nouveautés...

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    effectivement j'utlise la version 1.1 ! Mon chef me l'impose

  8. #8
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    Bon, et bien dans ce cas je crois qu'il va falloir en passer par un stockage explicite des index au niveau de l'instance...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    		// permet de stocker les index dans la ListView des images déjà affichées
    		private Hashtable _imageIndexes = new Hashtable();
     
    		private void BTAjouter_Click(object sender, EventArgs e)
    		{
    			ImageList ImageList1 = (listView1.LargeImageList != null && listView1.LargeImageList.Images.Count > 0)
    				? listView1.LargeImageList
    				: new ImageList();
    			ImageList1.ImageSize = new Size(50, 50);
     
    			for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++)
    			{				
    				// sert de clef pour l'index de l'image
    				string imageName = checkedListBox1.CheckedItems[i].ToString();
     
    				if (!_imageIndexes.ContainsKey(imageName))
    				{
    					int imageIndex = ImageList1.Images.Count;
     
    					ImageList1.Images.Add(Image.FromFile((UrlEncours+"\\"+checkedListBox1.CheckedItems[i])); 
    					listView1.Items.Add(imageName, imageIndex);
    					_imageIndexes.Add(imageName, imageIndex);
    				}
    			}
     
    			listView1.LargeImageList = ImageList1;
    			listView1.View = View.LargeIcon;
    		}
    Je n'ai pas le framework 1.1 installé sur cette machine, et n'ai donc pas pu vérifier, mais ce coup-ci je pense que ça n'utilise pas de nouveauté du 2.0.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    ca marche nikel ! Merci !
    Le seul hic est ke l'on ne peut ajouter uen meme images qu'une fois ... j'ai rien contre les doublons moi !

  10. #10
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    Le seul hic est ke l'on ne peut ajouter uen meme images qu'une fois ... j'ai rien contre les doublons moi !

    Fallait le dire ! Pour moi, c'était tout le problème justement : éviter les doublons !
    Cela dit, j'aurais pu m'en douter, parce que là le découplage de l'état de la ListBox et de la ListView prend tout son sens...

    Bon, avant de proposer autre-chose, est-ce que tu veux autoriser les doublons partout (ListView et ImageList) ou seulement au niveau de la ListView (les doublons pointent tous vers la même image de l'ImageList) ?

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    aye bonne kestion ca ... Disons 2 doublons = meme image. En fait le but c de permetre au user apres de remplir une description pr chak foto et de mettre a jour apres mon fichier xml. A la fin une photo peut se retrouver ds plusieurs themes mais la description est unique pr chaque foto.
    Si c pa clair c normal, c un peu flou ds ma tete aussi

  12. #12
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    Bon, juste une ligne à déplacer et légèrement modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // permet de stocker les index des images dans la ListView
    		private Hashtable _imageIndexes = new Hashtable();
     
    		private void BTAjouter_Click(object sender, EventArgs e)
    		{
    			ImageList ImageList1 = (listView1.LargeImageList != null && listView1.LargeImageList.Images.Count > 0)
    				? listView1.LargeImageList
    				: new ImageList();
    			ImageList1.ImageSize = new Size(50, 50);
     
    			for (int i = 0; i < checkedListBox1.CheckedItems.Count; i++)
    			{
    				// sert de clef pour l'index de l'image
    				string imageName = checkedListBox1.CheckedItems[i].ToString();
     
     
    				if (!_imageIndexes.ContainsKey(imageName))
    				{
    					int imageIndex = ImageList1.Images.Count;
    					ImageList1.Images.Add(Image.FromFile((UrlEncours+"\\"+checkedListBox1.CheckedItems[i])); 
    					_imageIndexes.Add(imageName, imageIndex);
    				}
    				listView1.Items.Add(imageName, (int)_imageIndexes[imageName]);
    			}
     
    			listView1.LargeImageList = ImageList1;
    			listView1.View = View.LargeIcon;
    		}
    J'espère que ça ira.

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 41
    Points : 25
    Points
    25
    Par défaut
    You're the best ! Merci Wyatan !

  14. #14
    Membre régulier
    Inscrit en
    Juillet 2005
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 83
    Points : 100
    Points
    100
    Par défaut
    De rien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [A-03] Problème avec imagelist et listview
    Par PokPok dans le forum IHM
    Réponses: 1
    Dernier message: 15/01/2009, 19h57
  2. ImageList et ListView
    Par Finality dans le forum Windows Forms
    Réponses: 1
    Dernier message: 04/01/2008, 21h38
  3. [VBA]Associer listview et imagelist dans access
    Par francois21 dans le forum VBA Access
    Réponses: 2
    Dernier message: 25/05/2007, 13h00
  4. ListViews et ImageLists
    Par nbeligh dans le forum Visual C++
    Réponses: 3
    Dernier message: 01/11/2006, 13h10
  5. Affectation d'une imagelist à une listview
    Par foued_scorpion dans le forum Windows
    Réponses: 12
    Dernier message: 18/10/2006, 10h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo