07. juni 2005 - 15:34Der 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?
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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 :
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"]);} }
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.
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:
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 :-)
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.
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"?
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:
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
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
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 :)
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.