Ressources et Images

Ressources et Images - C#/.NET managed - Programmation

Marsh Posté le 05-10-2007 à 11:35:27    

Bonjour,
 
J'ai créé un Web Server Control, enfin un Composite Control pour etre précis.  
Mais j aimerais pouvoir mettre des icones qui serait inclus dans la dll de manière à ce que les utilisateurs ne doivent pas se préoccuper des icones du tout mais que tout soit dans cette dll.
J'ai donc mit les images dans un fichier ressources mais appres comment attribuer mon Image à un ImageButton?
 
D'avance merci
 
Ben


Message édité par the big ben le 05-10-2007 à 13:29:09
Reply

Marsh Posté le 05-10-2007 à 11:35:27   

Reply

Marsh Posté le 05-10-2007 à 13:50:34    

Je doute qu'il existe une solution toute faite.
 
Le plus simple est donc d'ajouter à ta DLL une page CS (un autre contrôle utilisateur peut-être) nommé "LoadResource".
 
Ce contrôle attends en QueryString le nom de l'icône.
 
Il recherche l'image correspondante dans les recources du projet, et retourne avec un Response.BinaryWrite() le contenu binaire du fichier, et en header ce qu'il faut pour que ça corresponde au format du fichier.
 
Ensuite, dans ton contrôle principal, tu indiques juste l'url de ta page avec le bon paramètre :
 

Code :
  1. MonImageButton.ImageUrl = "LoadResource.aspx?resourcename=btnOk.png";


 
Il y a peut-être moyen de faire plus simple, mais cette solution devrait fonctionner sans problème, donc à défaut de mieux...

Reply

Marsh Posté le 05-10-2007 à 14:13:08    

Bon je me lance je vais tenter ca...

Reply

Marsh Posté le 05-10-2007 à 14:13:42    

Testé et approuvé :
 
TestBtn.ascx :

Code :
  1. <%@ Control Language="C#" AutoEventWireup="true" CodeFile="TestImg.ascx.cs" Inherits="Controls_TestImg" %>
  2. <asp:ImageButton ID="ImageButton1" runat="server" />


 
TestBtn.ascx.cs :

Code :
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Collections;
  5. using System.Web;
  6. using System.Web.Security;
  7. using System.Web.UI;
  8. using System.Web.UI.WebControls;
  9. using System.Web.UI.WebControls.WebParts;
  10. using System.Web.UI.HtmlControls;
  11.  
  12. public partial class Controls_TestImg : System.Web.UI.UserControl
  13. {
  14.    protected void Page_Load(object sender, EventArgs e)
  15.    {
  16.        ImageButton1.ImageUrl = "LoadResource.aspx?resourcename=avatar_hfr";
  17.    }
  18. }


 
LoadResource.aspx

Code :
  1. <%@ Page Language="C#" AutoEventWireup="true" CodeFile="LoadResource.aspx.cs" Inherits="Controls_LoadResource" %>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head id="Head1" runat="server">
  5.    <title>Untitled Page</title>
  6. </head>
  7. <body>
  8.    <form id="form1" runat="server">
  9.    </form>
  10. </body>
  11. </html>


 
LoadResource.aspx.cs :

Code :
  1. using System;
  2. using System.IO;
  3. using System.Drawing;
  4. using System.Drawing.Imaging;
  5. /*
  6. using System.Configuration;
  7. using System.Collections;
  8. using System.Web;
  9. using System.Web.Security;
  10. using System.Web.UI;
  11. using System.Web.UI.WebControls;
  12. using System.Web.UI.WebControls.WebParts;
  13. using System.Web.UI.HtmlControls;
  14. */
  15.  
  16. public partial class Controls_LoadResource : System.Web.UI.Page
  17. {
  18.    protected void Page_Load(object sender, EventArgs e)
  19.    {
  20.        if (Request.QueryString["resourcename"] == null)
  21.        {
  22.            Response.Redirect("~/Default.aspx" );
  23.        }
  24.  
  25.        Image i = (Image)Resources.Resource.ResourceManager.GetObject(Request.QueryString["resourcename"]);
  26.        MemoryStream ms = new MemoryStream();
  27.        i.Save(ms, ImageFormat.Png);
  28.        Response.ContentType = "image/png";
  29.        Response.BinaryWrite(ms.ToArray());
  30.        ms.Close();
  31.    }
  32. }


 
Main.master :

Code :
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml" >
  3. <head runat="server">
  4.    <title>Untitled Page</title>
  5. </head>
  6. <body>
  7.    <form id="form1" runat="server">
  8.    <div>
  9.        <uc1:Login ID="Login1" runat="server" />
  10.        <uc2:TestImg ID="TestImg1" runat="server" />
  11.        <asp:Menu ID="Menu1" runat="server" DataSourceID="SiteMapDataSource1" BackColor="#E3EAEB" DynamicHorizontalOffset="2" Font-Names="Verdana" Font-Size="0.8em" ForeColor="#666666" StaticSubMenuIndent="10px">
  12.            <StaticMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
  13.            <DynamicHoverStyle BackColor="#666666" ForeColor="White" />
  14.            <DynamicMenuStyle BackColor="#E3EAEB" />
  15.            <StaticSelectedStyle BackColor="#1C5E55" />
  16.            <DynamicSelectedStyle BackColor="#1C5E55" />
  17.            <DynamicMenuItemStyle HorizontalPadding="5px" VerticalPadding="2px" />
  18.            <StaticHoverStyle BackColor="#666666" ForeColor="White" />
  19.        </asp:Menu>
  20.        <asp:SiteMapDataSource ID="SiteMapDataSource1" runat="server" />
  21.        <asp:contentplaceholder id="ContentPlaceHolder1" runat="server">
  22.        </asp:contentplaceholder>
  23.        </div>
  24.    </form>
  25. </body>
  26. </html>


 
Résultat :
http://img214.imageshack.us/img214/2234/btnresourceta7.png

Reply

Marsh Posté le 05-10-2007 à 14:16:43    

Par contre, t'as parfaitement le droit de dire que...
 

Code :
  1. Image i = (Image)Resources.Resource.ResourceManager.GetObject(Request.QueryString["resourcename"]);
  2. MemoryStream ms = new MemoryStream();
  3. i.Save(ms, ImageFormat.Png);
  4. Response.ContentType = "image/png";
  5. Response.BinaryWrite(ms.ToArray());
  6. ms.Close();


 
C'est bien du bordel pour afficher une bête image :D
 
- Extraction du fichier de la DLL vers la mémoire avec décodage de la compression
- Réencodage de la compression et recopie en mémoire dans un stream
- Recopie du stream en mémoire dans un array de byte
- Recopie du array de byte vers le outputstream
 
:pt1cable:

Reply

Marsh Posté le 05-10-2007 à 14:22:09    

Et normalement je peut inclure une page aspx dans une Web Control Library?

Reply

Marsh Posté le 05-10-2007 à 14:23:07    

Ca, aucune idée. J'espère que oui :D
 
Je trouve pas ce type de projet dans mon vs... Alors du coup j'ai juste fais ça dans un site.


Message édité par MagicBuzz le 05-10-2007 à 14:24:18
Reply

Marsh Posté le 05-10-2007 à 14:27:45    

Ca se trouve sous Visual C# - Windows
Ben oui je pige pas non plus pourquoi ils l ont mis la...

Reply

Marsh Posté le 05-10-2007 à 14:30:43    

Ca y est, j'ai trouvé.
(planqué dans les projets "windows"... pige pas trop pkoi c'est pas dans "web"...)
-- grillaid en fait --
 
Ca marche comment ton bouzin ?


Message édité par MagicBuzz le 05-10-2007 à 14:31:24
Reply

Marsh Posté le 05-10-2007 à 14:34:12    

Simplement ma classe est la suivante. puis tu compile, tu ajouter la dll que tu viens de compiler dans ton Design Panel et ensuite comme un control normal tu fait un drag and drop dans ta page web
 

Code :
  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Collections;
  5. using System.Collections.Generic;
  6. using System.ComponentModel;
  7. using System.Text;
  8. using System.Web;
  9. using System.Web.Security;
  10. using System.Web.UI;
  11. using System.Web.UI.WebControls;
  12. using System.Web.UI.WebControls.WebParts;
  13. using System.Web.UI.HtmlControls;
  14. using System.Resources;
  15. using System.IO;
  16. using System.Drawing;
  17. using System.Drawing.Imaging;
  18. using System.Drawing.Drawing2D;
  19. namespace BenFileManager
  20. {
  21.     public delegate void ClickBrowseEvent(object sender, EventArgs e);
  22.     [DefaultProperty("UploadPath" )]
  23.     [ToolboxData("<{0}:FileManager runat=server></{0}:FileManager>" )]   
  24.     public class FileManager : CompositeControl
  25.     {       
  26.         //Initialize method   
  27.         protected override void CreateChildControls()
  28.         {
  29.             ImageButton ib = new ImageButton();
  30.             ib.ImageUrl = "LoadRessource.aspx?resourcename=avi";
  31.             Controls.Add(ib);
  32.            
  33.         }       
  34.     }
  35. }

Reply

Marsh Posté le 05-10-2007 à 14:34:12   

Reply

Marsh Posté le 05-10-2007 à 14:35:06    

Par contre je viens d essayer et je pense pas que l on puisse mettre de page aspx
 
Au besoin mini tuto pour le Server Web Control: http://www.techheadbrothers.com/Ar [...] nfirmation


Message édité par the big ben le 05-10-2007 à 14:36:24
Reply

Marsh Posté le 05-10-2007 à 14:39:52    

Bon, effectivement, t'es mal, je vois pas du tout comment tu peux faire.
 
(pourquoi tu passes par ce truc ? ç'a m'a l'aire bien compliqué pour pas grand chose ce bignou)

Reply

Marsh Posté le 05-10-2007 à 14:42:11    

Par contre, je pense à un truc.
 
Certains sites fonctionnent de la façon suivante :
 
http://domaine/toto.dll?methodname [...] 1=coincoin
 
=> et ça lance plop(coincoin) qui est une méthode située dans la dll
Je suppose que ton salut se trouve dans cette "solution". Reste à trouver comment la mettre en place :D
 
ceci dit, c'est gore, parceque ça oblige à exposer la DLL dans path public (donc sujet aux attaques) et ça oblige à travailler avec un nom de dll et un chemin d'accès à cette dernière qui soit figé... donc source de pas mal de problèmes de dépoliement.
deplus, pour "exécuter une dll" cela nécessite d'avoir IIS paramétré en mode "autoriser l'exécution d'exécutable", ce qui est une faille potentielle très importante : un petit malin uploade un EXE sur ton serveur, et zou, il a juste à taper l'url où le fichier a été déposé pour démarrer le programme sur le serveur... je te laisse imaginer les ravages que ça peut faire si l'admin du serveur n'a aucune expérience dans la sécurisation :D


Message édité par MagicBuzz le 05-10-2007 à 14:45:12
Reply

Marsh Posté le 05-10-2007 à 14:44:38    

Pourquoi je passe par ca? Ben pour créer vraiment un user control que je pourrai intégrer facilement sur tout mes site et mon but est de le rendre totalement libre donc que d autres personne puissent égelement en profiter et sans devoir se prendre la tete.

Reply

Marsh Posté le 05-10-2007 à 14:48:08    

Mais donc non ca ne fonctionne pas trop avec ta solution snif surtout que j avais utilisé la meme methode pour créer mes images Thumbs (tu m avais d ailleur aidé aussi il y a qq jours) et du coup j en revient au point de départ!  :pfff:  :pfff:  :pfff:


Message édité par the big ben le 05-10-2007 à 14:48:26
Reply

Marsh Posté le 05-10-2007 à 14:48:34    

Je crois que tu te feras moins chier en rendant l'accès aux images paramétrage... :/
 
autre solution, tu stockes les images sur un serveur public et tu hardcode leur chemin d'accès dans la dll.
mais bon c'est très très moyen

Reply

Marsh Posté le 05-10-2007 à 14:50:20    

sinon, tu fais de l'ascii art, c'est joli l'ascii art :D

Reply

Marsh Posté le 05-10-2007 à 14:55:22    

LOL. Non mais ca veut dire que  
 - soit je ne le met pas en dll donc on doit chaque fois copier
    - le user control
    - la page de génération de Thumbs
    - les icones
 - soit j arrive à créer par une autre methode en gardant ma dll (je voit pas trop comment) et on a juste à intégrer la dll, on peut le prendre en mode design, le jour ou je fait un changement je doit pas changer tout les site, il suffit de redeployer la dll.

Reply

Marsh Posté le 05-10-2007 à 15:27:57    

Whoooooo ca fonctionne. Ils expliquent ici : http://aspnet.4guysfromrolla.com/a [...] 906-1.aspx comment faire pour embarquer une ressource et il suffit d adapter un peu pour faire de meme avec des images.

Reply

Marsh Posté le 05-10-2007 à 15:42:30    

Et hop un petit post sur mon blog en francais pour les alergiques à l anglais: http://www.pharmacommerce.be/blog/ [...] ns-le-code
 
Merci pour ton aide en tt cas!


Message édité par the big ben le 05-10-2007 à 15:50:33
Reply

Marsh Posté le 05-10-2007 à 16:02:25    

grmpf ! :)

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed