Avatar billede brian0905 Nybegynder
07. juni 2005 - 15:34 Der er 8 kommentarer og
1 løsning

Custom Control der generer et billede

Hej,

Jeg sidder og leger med Custom Controls i ASP.NET jeg vil nu gerne lave en simpel Custom Control, der viser et lagkage diagram. Det hele skal laves som en assembly, der kan tilføjes toolboksen og dragges ud i designeren, design-time. Mit problem er at jeg ikke kan gennemskue hvordan jeg skal sende mit billede til response streamen. En custom control har kun en HtmlTextWriter, men jeg vil gerne oprette et bitmap (eller en anden type billede) og sende den til min side som en stream eller ligenende (og nej, det dur ikke at gemme billedet først på maskinen, for hvem ved hvor denne komponent kommer hen og kører og det er ikke sikkert at der er rettigheder til at gemme billeder).  Kort: hvordan sender jeg et bitmap til min response stream i en Custom Control?
Avatar billede snepnet Nybegynder
07. juni 2005 - 16:22 #1
du kan bare gemme et bitmap direkte i din stream.
someBitmap.Save(Response.OutputStream... // tager et par parametre til.

mvh
Avatar billede snepnet Nybegynder
07. juni 2005 - 16:30 #2
du skal være opmærksom på, at får at få et billede vist - skal du kunne give det en url.
den url skal så resultere i et output i form af et billede - f.eks. sådan her :

<img src="ImageServer.aspx?ImageId=1" ...

og på den siden (ImageServer.aspx) skal du så ikke rendere andet ud end billedet, så en sådan side kunne se sådan her ud :

aspx-filen :
<%@ Page language="c#" Codebehind="ImageServer.aspx.cs" Inherits="SomeNS.ImageServer" EnableSessionState="False" enableViewState="False"%>

og en codebehind (den væsentlige del af den) som følger :
public class ImageServer : System.Web.UI.Page
{
    protected int ImageId
    {
        get{return int.Parse(Request.QueryString["ImageId"]);}
    }

    private void Page_Load(object sender, System.EventArgs e)
    {
        Response.ContentType = "JPG";                           
        Response.BinaryWrite( new DataAccess.DataAccess().GetImageBytes(ImageId) );
    }
}

her bruges så bare en metode på responsobjektet istedet, men resultatet er det samme... du får smidt dine bytes i streamen.
ovenstående illustrerer bare at du henter data i en base udfra id, og sender dem efter klienten.

det er ikke bare noget du kan lave i en customcontrol alene... du bliver nødt til at have en url du kan ramme, som returnerer billedet.

er du med på den - eller er det noget tågeri ?

mvh
Avatar billede brian0905 Nybegynder
08. juni 2005 - 09:51 #3
Jeg er med, jeg synes bare det er meget lidt "pænt" den kode der kommer ind i min .aspx side. Jeg havde håbet på at kunne give parametrene til mit lagkage diagram direkte fra min .aspx side:

fx.

<piechart name="pie1">
  <slice name="slice1" value"25%" color="Red">Male</slice>
  <slice name="slice2" value"75%" color="Green">Female</slice>
</piechart>

og dette så vil give mig et lagkage diagram, der indeholder to slices der repræsenterer Male og Female. Og så står min kode for at tegne dette lagkagediagram til min response stream. Således jeg kommer ud over at skulle lave dette: <img src="piechart.aspx?slices=2&male=25&female=75"> som jeg synes bliver meget rodet og meget besværligt at arbejde med. Problemet med det jeg gerne vil er at det kræver en response stream, og når jeg har en Custom Control har jeg vel kun en HtmlTextWriter ???  Håber det gav mening :-)
Avatar billede snepnet Nybegynder
08. juni 2005 - 10:37 #4
du har altid mulighed for at få fat i din stream når du laver kontroller. du kan bare tage den på
this.Page.Response.OutputStream
men writeren skriver til din stream, så jeg tror ikke du får så meget ud af at gå på den direkte.

sådan en som denne vil jo give dig et billede på siden :

public class ImageControl : Control
{
    protected override void Render(HtmlTextWriter writer)
    {
        writer.AddAttribute(HtmlTextWriterAttribute.Src, "images/img.gif");
        writer.RenderBeginTag(HtmlTextWriterTag.Img);
        writer.RenderEndTag();
    }
}

nu er den jo ikke så fiks, da den bare peger på et (måske) eksisterende billede, men det er da en kontrol der benytter writeren til at rendere et imagetag.

mvh
Avatar billede brian0905 Nybegynder
08. juni 2005 - 11:58 #5
Hmm.... alt afhængigt af hvor min komponent kommer hen, så kan jeg jo ikke garantere at jeg må skrive til det bibliotek....

Hvordan gør andre graf komponenter det? de må da gøre noget smart!!!

Jeg vil bare gerne stadig have den tilgængelig i min designer og mulighed for at redigere min graf der... og så lave et pie on the fly når siden loades..... er der en anden måde man kan gøre det på, taget i betragtning mine tidligere "ønsker" om at det skal være "pænt"?
Avatar billede burningice Nybegynder
08. juni 2005 - 15:51 #6
jeg ville lave en to delt løsning. En del som er selve klassen der genererer billedet. Det behøvers ikke at være en aspx-side, men kan bare være en handler der er registreret i din webconfig. Denne klasse skal generere billedet ud fra de informationer den får i sin querystring.

Dernæst vil jeg lave en Custrom Control som indsættes på den side grafen skal være på. Denne Control kan enten have en masse properties:

<B:Graf id="hej" Size="100" Type="Pie" Data="data.xml" runat="server" />

eller være templated

<B:Graf id="hej" Size="100" Type="Pie" runat="server" />
  <slice name="slice1" value"25%" color="Red">Male</slice>
  <slice name="slice2" value"75%" color="Green">Female</slice>
<B:Graf>

Eller måske kunne klare begge dele, det er lidt underordnet.

Når at graf-klassen så skal rendere sig selv, skal den outputte et img-tag med en querystring der matcher de informationer der er givet til kontrollen. I det første eksmpel kunne det blive til

<img src="graphMaker.aspx?type=pie&size=100&datatype=file&data=data.xml" />

i det andet tilfælde bliver det til

<img src="graphMaker.aspx?type=pie&size=100&datatype=session&key=23esdf3" />

hvor at de to slice-informationer er blevet gemt i sessionen med key'en 23esdf3 (som selvfølgelig er autogenereret).

din graphMaker henter så disse informationer ud af querystringen og genererer en graf der passer til.

Meget pænere kan det ikke gøres.
Avatar billede brian0905 Nybegynder
10. juni 2005 - 15:58 #7
Takker.... problemet er vel at er i en paremeterlist kun kan være 1023 characters... men det løser jeg når jeg kommer til det... takker burningice, smid lige et svar
Avatar billede burningice Nybegynder
25. juni 2005 - 10:56 #8
det er rigtigt at en querystring har en begrænsning i længden... men så må du bare gemmere paremtrene i din Session og henvise til den i din querystring :)

<img src="graphMaker.aspx?parameterlist=session&pkey=23esdf3" />

<img src="graphMaker.aspx?parameterlist=inline&type=pie&size=100&datatype=file&data=data.xml" />
Avatar billede burningice Nybegynder
25. juni 2005 - 10:56 #9
.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester