[RESOLU] Insérer image dans une gridview

Hello,

Bon après avoir résolu mon problème d’affichage de Gridview. Je rencontre un autre problème. Je veux pouvoir afficher une image dans une de cellules.

Voici le code de la Gridview :

[code]dt = new DataTable(“Activities”);
dt.Columns.Add(new DataColumn(“Icon”, typeof(Image)));
dt.Columns.Add(new DataColumn(“Sujet”, typeof(String))); //, typeof(LinkButton)));
dt.Columns.Add(new DataColumn(“Date début”));
dt.Columns.Add(new DataColumn(“Priorité”));
dt.Columns.Add(new DataColumn(“Description”));

					Image img = new Image();
					img.GenerateEmptyAlternateText = true;
					img.ImageAlign = ImageAlign.Left;
					HtmlImage HTMLimg = new HtmlImage();

		foreach (EntityCRM activity in activities)
		{
			// Activités ouvertes
			if (activity.EntityStateCode != "Completed")
			{
				img.ImageUrl = activity.EntityIcon;
				HTMLimg.Src = activity.EntityIcon;
				dr = dt.NewRow();
				dr["Icon"] = img;
				dr["Sujet"] = @"<img src=" + HTMLimg.Src + "> " + activity.EntityName; //urlData;  //"<a href=\"http://url/edit.aspx?id={" + opportunity.EntityID.Value + "}\">" + opportunity.EntityName + "</a>";
				dr["Date début"] = activity.EntityStartDate;
				dr["Priorité"] = activity.EntityPriority;
				dr["Description"] = activity.EntityDescription;
				dt.Rows.Add(dr);
			}
		}

		gridV = new GridView();
		gridV.DataSource = dt;
		gridV.Databind();[/code]

La gridview est parfaitement générée. Mais je ne vois pas l’image et ni la colonne “Icon”. Dans le champ “Sujet” je vois la chaine “<img …>” au lieu de l’image. Du coup, je me demande si c’est possible d’afficher une image dans une des cellules de la gridview, sachant que je n’ai aucun accès à la partie Design. Toujours dans l’esprit de Webpart, je dois tout faire dans le code.

Hmmm… Sans pouvoir créer de AspNetWebHandler à côté, ca va être difficile.

Si je me souviens bien, dans les objets genre gridview, tu as aussi des évènements genre itemDataBound.

Ces fonctions sont lancés pendant la création de la table,

dans ces fonctions tu peux récupérer l’objet “cellule” et lui ajouter dedans un autre objet, genre une Image ou une HtmlImage.

Si tu piges rien à ce que j’ai expliquer, PM moi j’essairai de te trouver un exemple

Le problème n’est pas de modifier le template, mais plutot d’avoir la possibilité de Récupérer l’url de l’image. En effet, vu qu’elle est stockée en base de données, il faut passer par un WebCustomHandler… Hors, visiblement là, c’est pas possible.

J’admet que je comprends pas alors.

J’ai fait cette manip 100 fois, que l’url de l’image soit dans la bdd ou ailleurs ça m’a pas gêné!

Par contre moi j’étais sous .NET 1.1 et c’était pas des gridviews mais des datagrid, c’est si différent ??

L’url n’est pas stockée en base de données. L’image est stockée directement sur la machine serveur enfin pour l’instant. Je vais jeter un oeil sur le fonctionnement du itemDataBound en code behind only. Celà dit, je ne pourrais pas vous donner un feedback rapidement vu qu’on vient de me filer un boulot complètement différent.

D’après le code que tu nous as fourni, je déduis que ton image est directement stockée dans la base de donnée.
Généralement pour fournir un accès à une image directement stockée en BDD, on crée un WebHandler qui permettra de récupérer l’image via une url du type : http://monserveur/bddstoredimage.ashx?id=[id_de_l_enregistrement].
Hors, si j’ai bien compris, tu es dans un contexte “Sharepoint” où tu n’as pas la possibilité de créer un tel Asp.Net WebHandler.

Au passage, petit rappel de la problématique : en HTML, tu ne peux pas mettre directement les données binaires qui constituent ton image mais seulement quelque chose du genre : . Voilà la raison du WebHandler.

Le “img.ImageUrl = activity.EntityIcon;” représente le chemin relatif de l’image. Je ne la récupère pas d’une quelconque BDD.
L’image est stocké dans le repertoire de SharePoint qui est accessible via l’adresse de ce type :
“http://mySharePointWebApplication.com:port/_layouts/images/<chemin_images>/<mon_image.jpg>”

Mais qui est stocké physiquement dans :
“C:\Program Files\Fichiers communs\Microsoft Shared\web server extensions\12\TEMPLATE\IMAGES<chemin_images>”

Ok Girafologue, je comprends ce que tu voulais dire B)

Sinon moi je reste sur mon itemDataBound, je vois pas pquoi ça marcherait pas.

Effectivement, pour le coup, le ItemDataBound, ca peut marcher.
Maintenant, y’a plus propre. Tu peux créer ton template de colonne programmatiquement, en créant un CustomControl qui implémente ITemplate et en le passant comme template de ta colonne. (ca évite de laisse ASP.Net générer les contrôles de ta colonne puis de les virer pour les remplacer par les tiens).

Problème résolu. Ca marche imppec avec une gridview rowDatabound.