ListView et miniature !

Monico9385 Messages postés 279 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 6 août 2007 - 1 avril 2006 à 16:14
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 - 6 avril 2006 à 08:21
Bonjour tout le monde,



je viens poster parce que j'ai beau voir toutes les sources possibles
sur différents sites, et notamment celui la, j'arrive pas à comprendre
et à faire un affichage de miniature dans un listview. Ce que je
voudrai, c'est à partir d'un explorateur, afficher en fonction du
répertoire sélectionné dans celui ci, afficher toutes les images de ce
répertoire sous forme de miniature, mais j'y arrive pas.



Est ce que je dois passer par un controle ImageList en plus du ListView ou non?

Et surtout quel code je dois appliquer par rapport à mon chemin, parce
que tout ce que j'essaye en fonction de ce que je récupère ne marche
pas, et je commence à désespérer la ...



Si quelqu'un pouvait m'aider, ce serait génial !!!



Merci d'avance

14 réponses

cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
1 avril 2006 à 16:56
Salut,
Oui, il faut construire une ImageList, l'associé au ListView (avec la property SmallImageList / View) puis spécifié l'index de l'image à ajouter lors de l'ajout de l'item à la collection, petit exemple :

ListViewItem itemTitle = new ListViewItem(myString, 0); // 0 c'est l'index de l'image dans l'ImageList
myListView.Items.Add(itemTitle); // Ajout au listView


<HR>
[/auteurdetail.aspx?ID=13319
[Pub] ]http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
Monico9385 Messages postés 279 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 6 août 2007
1 avril 2006 à 18:09
salut,



merci de ton aide. Je suis plus tres loin maintenant car en fait ca
liste bien, mais ca n'affiche pas sous formes de miniatures mais juste
le chemin du fichier.



voila mon code, qu'est ce que je pourrai rajouter pour afficher les miniatures :)



private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)

{

int i;



ImageList imageListSmall = new ImageList();



String[] photos = Directory.GetFiles(treeView1.SelectedNode.FullPath);

FileInfo infosFichier;



this.listViewPhoto.Items.Clear();

try

{

for (i = 0; i < photos.Length; i++)

{


infosFichier = new
FileInfo(photos[i]);




if ((infosFichier.Extension "bmp") || (infosFichier.Extension "jpg")|| (infosFichier.Extension
"jpeg"))

continue;


ListViewItem itemTitle = new
ListViewItem(photos, 0); // 0 c'est l'index de l'image dans l'ImageList



listViewPhoto.Items.Add(itemTitle); // Ajout au listView





//listViewPhoto.Images.Add(Bitmap.FromFile(photos[i]));//Bitmap.FromFile(photos[i])


//listViewPhoto.SmallImageList =
imageListSmall;

}

}

catch {}



}
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
1 avril 2006 à 18:25
Tu dois ajouter les images dans l'ImageList!
Actuellement, ton object imageListSmall est vide. Si mes souvenirs sont bons, c'est quelques chose comme ca:

imageListSmall.Images.Add(...); // Ajoute-en combien tu veux

Puis assigner ton object ImageList à la propriété SmallImageList du ListView une fois qu'il est remplit.


<HR>
[/auteurdetail.aspx?ID=13319
[Pub] ]http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
Monico9385 Messages postés 279 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 6 août 2007
1 avril 2006 à 18:52
j'ai fait ca mais ca ne marche pas



private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)

{

int i;



ImageList imageListSmall = new ImageList();



String[] photos = Directory.GetFiles(treeView1.SelectedNode.FullPath);

FileInfo infosFichier;



this.listViewPhoto.Items.Clear();

try

{

for (i = 0; i < photos.Length; i++)

{


infosFichier = new
FileInfo(photos[i]);




if ((infosFichier.Extension "bmp") || (infosFichier.Extension "jpg")|| (infosFichier.Extension
"jpeg"))

continue;


ListViewItem itemTitle = new
ListViewItem(photos, 0); // 0 c'est l'index de l'image dans l'ImageList



listViewPhoto.Items.Add(itemTitle); // Ajout au listView

imageListSmall.Images.Add(Bitmap.FromFile(photos[i]));


listViewPhoto.SmallImageList =
imageListSmall;

}

}

catch {}



}



encore un ptit peu d'aide
0

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

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
1 avril 2006 à 19:36
Pourquoi tu fais ça dans une boucle?

1) Créer un listView.
2) Créer une ImageList et remplit la
3) Créer tes listViewItem en fonction de ton ImageList (en insérant l'index de l'image à insérer)
4) Ajoute le ListViewItem à la collection des ListViewItem du ListView

En gros :

ListView lv = new ListView (généré par le designer... )
ImageList il = new ImageList (éventuellement généré par le designer)
foreach(string s in photos) il.Images.Add(Bitmap.FromFile(s)); // Remplit l'ImageList avec tes images

Maintenant le for pour remplir les éléments
for(...i....)
{
ListViewItem itemTitle = new ListViewItem("text", i)
listViewPhoto.Items.Add(itemTitle);
}

listViewPhoto.SmallImageList = il;
listViewPhoto.View = View.SmallIcon;

Voilà en gros ce qu'il faut faire (de tête).
Et je ne comprend pas pourquoi tu fais un if avec le type des images?


<HR>

[Pub] http://www
0
Monico9385 Messages postés 279 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 6 août 2007
1 avril 2006 à 20:31
Je comprend pas la, j'ai repris ce que tu m'as donné, mais ca marche
pas. J'ai pas d'erreur au niveau de la compilation, mais quand
j'execute, ca me met une erreuur sur ce qu'il y a dans le foreach : une
erreur de mémoire :(



J'ai fait ca pourtant :



private void treeView1_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)

{

int i;

String[] photos = Directory.GetFiles(treeView1.SelectedNode.FullPath);



ListView lv = new ListView();

ImageList il = new ImageList();

foreach(string s in photos)

{


il.Images.Add(Bitmap.FromFile(s)); // Remplit
l'ImageList avec tes images

}



for (i = 0; i < photos.Length; i++)

{


ListViewItem itemTitle = new
ListViewItem("text", i);



listViewPhoto.Items.Add(itemTitle);

}



listViewPhoto.SmallImageList = il;

listViewPhoto.View = View.SmallIcon;



}


Sinon je faisais un if sur les extensions, car j'avais recupérer un
code qui faisait comme ca, mais si y a pas besoin, je le met pas :)



Désolé de te demander tout ca, mais je suis débutant, et j'ai un peu de
mal à comprendre tout. Mais je suis sur que la solution n'est pas tres
loin... Je cherche en meme temps :)
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
1 avril 2006 à 21:46
Un conseil, pour l'instant oublie ton TreeView et concentre-toi seulement sur le ListView (oublie donc ton event AfterSelect).

Créer une nouvelle form dans ton projet.
Ajoute avec le designer un ListView (mets la propriété View à SmallImageList) et appelle le listViewPhoto.
Maintenant, avec le designer encore, ajoute une ImageList, et avec le designer toujours, ajoute des images dedans (pour l'instant, tu dois avoir écris aucun code) [Tu appelles l'imageList imgList].
Maintenant, avec le designer encore, tu mets la proprieté SmallImageList de ton ListView à la valeur de ton ImageList (il détecte automatiquement que tu as construit une ImageList). J'espère que tu me suis.

Ok, maintenant, dans le Load de ta form, tu écris ceci :

for(int i=0; i
[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
Monico9385 Messages postés 279 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 6 août 2007
2 avril 2006 à 12:22
Oui j'ai bien compris !!! j'ai donc fait tout ce que tu m'as dit, ca
marche parfaitement, sauf que dans le code généré y a rien qui reprend
l'insertion des images dans l'imageList. j'ai juste ca :



this.imgList.ImageStream = ((System.Windows.Forms.ImageListStreamer)(resources.GetObject("imgList.ImageStream")));



mais rien qui indique le chemin des images, ou meme l'insertion :( c'est normal?
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 avril 2006 à 12:35
Oui oui c'est normal ;-)
Quand tu fais cela avec le designer, les images sont insérées statiquement en tant que resources, et la ligne que tu as postées ci-dessus va justement rechercher ces images dans les resources !
Si tu dois les insérer dynamiquement, tu dois faire comme je t'ai expliqué au début :

// pathCol est ton tableau qui contient les chemins vers les images
// C'est un tableau de string (string[])
foreach
(
string str
in
pathCol)
{
imgList.Images.Add(Image
.FromFile(str));
}


<HR>
[/auteurdetail.aspx?ID=13319
[Pub] ]http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
Monico9385 Messages postés 279 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 6 août 2007
2 avril 2006 à 13:05
Ah bah ca veut pas marcher !



je fais ca comme ca :

private void Form1_Load(object sender, System.EventArgs e)

{

String[]
pathCol = "C:\\Documents and
Settings\\Nicolas\\Bureau\\MonDossier";



foreach(string str in pathCol)

{

imgList.Images.Add(Image.FromFile(str));

}



for(int i=0; i<imgList.Images.Count; i++)

{


ListViewItem itemTitle = new ListViewItem("Mon
texte", i);

listViewPhoto.Items.Add(itemTitle);

}

listViewPhoto.SmallImageList = imgList;



}


mais il met une erreur comme quoi je peux pas convertir un string en
string[]. et quand je le met avec mon treeview, j'ai toujrous mon
erreur d'OutOfMemory sur imgList.Images.Add(Image.FromFile(str));
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
2 avril 2006 à 13:32
private
void Form1_Load(
object sender, System.
EventArgs e)
{

string dirLocation =
"C:\\Documents and Settings\\Nicolas\\Bureau\\MonDossier";

string[] pathCol = System.IO.
Directory.GetFiles(dirLocation);

// Etre sur que dans ton répertoire tu as que des images !
// Sinon faut faire un filtre
foreach(
string str
in pathCol) imgList.Images.Add(
Image.FromFile(str));





for(
int i=0; i
[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
Monico9385 Messages postés 279 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 6 août 2007
3 avril 2006 à 11:33
J'ai mis ca, mais j'ai l'erreur au moment de l'execution de OutOfMemory sur ce qui'il y a dans le foreach. Bisarre quand meme !
0
Monico9385 Messages postés 279 Date d'inscription lundi 29 mars 2004 Statut Membre Dernière intervention 6 août 2007
4 avril 2006 à 14:00
En fait, j'ai compris d'ou venait l'erreur de Mémoire. C'est parce
qu'il y avait d'autres fichiers que des images dans le répertoire !!!
Par contre j'arrive pas à appliquer un filtre, je vois pas où
l'appliquer et comment surtout ! Un ptit peu d'aide encore :D
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
6 avril 2006 à 08:21
C'est certainemnent pas la plus belle des manières, mais voilà une idée :

private
void Form1_Load(
object sender, System.
EventArgs e)
{

string dirLocation =
"C:\\Documents and Settings\\Nicolas\\Bureau\\MonDossier";

string[] pathCol = System.IO.
Directory.GetFiles(dirLocation);

foreach(
string str
in pathCol)
{
try
{
imgList.Images.Add(
Image.FromFile(str
));
}
catch {}

}





for(
int i=0; i
[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
0
Rejoignez-nous