Avatar billede llcoolj Nybegynder
03. oktober 2002 - 11:40 Der er 5 kommentarer og
1 løsning

Response objekt

Skal lige starte med at sige at jeg er rookie i ASP.NET....
Jeg sidder med et problem hvor jeg skal lave et søjlediagram, og og sådan set løst det ved at have det hele samlet i en codebehind cs.fil. Men jeg ville gerne kunne genbruge mine klasser, og derfor vil jeg gerne have samlet selve "tegningen" af diagrammet i en constructor i en separat klasse og således samle tegningen af diagrammet i en klasse til genbrug ved tegning af andre diagrammer med andet input.
MEN... i min løsning anvender jeg Response objektet i min page_Load metode og jeg kan ikke finde ud af at sende dette med som parameter til anvendelse i den separate klasse.

Har kigget lidt på følgende spørgsmål- men kan ikke få dette til at virke...http://www.eksperten.dk/spm/260913

Min kode der ikke er separeret endnu:
namespace PCV {
    using System;
    using System.Drawing;
    using System.Drawing.Imaging;
    using System.Drawing.Drawing2D;
    using System.Web;   
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using PCV;
   
    public class PMIHistogram : Page{
        private Rapport r = new Rapport();
        private Projekt p = new Projekt();
        private int height = 200;
        private int width  = 400;
        private Bitmap b;
        private string []xVal;
        private int []yVal;
        private int max=100;// deklareres her, da skal bruges på tværs af metoder.
       
        public void Page_Load(Object sender, EventArgs e)
        {           
            b = new Bitmap(width, height, PixelFormat.Format16bppRgb555);           
            Response.ContentType= "Image/jpeg";
            Session["kvartal"]= "2002 Q2";//midlertidig
            int [,]input= hentPMIVaerdier(Session["kvartal"].ToString());
            Graphics g = Graphics.FromImage(b);           
            doState(input);//forbereder data ud fra input.
            drawHistogram(xVal, yVal, max, width, height, g);//tegner histogram           
            b.Save(Response.OutputStream, ImageFormat.Jpeg);             
            b.Dispose();
        }//ends Page_Load
       
       
        public int[,] hentPMIVaerdier(string kvartal)
        {//Pre: None
        //POst: Alle PMI værdierne her returneret i form at et int[].   
            return r.hentPMIVaerdier(kvartal);
        }// end hentPMIVaerdier
       
        public void doState(int [,]data)
        //Pre:  None
        //Post: Y-aksen er tilpasset værdierne i [0,x]data
        {
            int[] temp= new int[data.Length/2];
            yVal=new int[data.Length/2];
           
            //Fylder yVal og xVal
            for(int i=0; i<data.Length/2; i++)
            {
                yVal[i]=data[0,i];
                temp[i]=data[1,i];           
            }
           
            //fylder xVal med projektnavnene istedet for id
            xVal=p.hentProjektNavne(temp);
           
            //sætter en dynamisk værdi for histogrammets brede ud fra antal projekter der skal vises
            if(xVal.Length>10)
                width=40*xVal.Length;           
           
           
          /* //Max findes, for at kunne angive toppen af y-aksen
            max=yVal[0];
            for(int i=0; i<yVal.Length; i++)
            {
                if(yVal[i]>max)
                    max=yVal[i];
            }// ends for */
                                 
          }//ends DoState
         
          public void drawHistogram(string []dataX, int [] dataY, int max, int width, int height, Graphics g)
          {         
            g.Clear(Color.White);//Giver en blank side
            g.SmoothingMode = SmoothingMode.AntiAlias;           
            Pen borderPen = new Pen(Color.Gray,1);
            Pen graphPen = new Pen(Color.Gray,1);
           
            int borderLeft,borderRight,borderTop, borderBottom;       
            int chartWidth, chartHeight;
            borderLeft=30;
            borderRight=10;
            borderTop=20;
            borderBottom=20;
            string strHeadline = "PMI Histogram";
            int intervalsY = max;//antal intervaller i vandrette gridlinier
           
            //Laver y-aksens højde mindre, hvis den er større end 10
            if(intervalsY>10)
                intervalsY=(int)(max/10);
            if(max%2 == 1)
                max++;
           
            chartWidth = width-borderLeft-borderRight;
            chartHeight = height-borderTop-borderBottom;
           
            Rectangle rec = new Rectangle(borderLeft,borderTop,chartWidth,chartHeight); //graf-område
            g.DrawRectangle(borderPen,0,0,width-1,height-1);
            LinearGradientBrush lb = new LinearGradientBrush(rec, Color.SteelBlue,Color.White,LinearGradientMode.Vertical);// giver baggrundsfarve fra blå til hvis horisontalt
            g.FillRectangle(lb,rec);
            g.DrawRectangle(borderPen,rec);
           
            StringFormat salign = new StringFormat();
            salign.Alignment = StringAlignment.Center;
            LinearGradientBrush blockbr = new LinearGradientBrush(rec, Color.Yellow,Color.Red,LinearGradientMode.Vertical);
            int blockWidth = (int)(chartWidth / (dataX.Length));
            double scale = (double)chartHeight/max;
           
            int x, y;           
            //For hver gennemløb tegnes der en Søjle.
            for(int i=0; i<dataX.Length/*-1*/; i++)
            {
                Trace.Write("datax længde "+dataX.Length);
                x = (int)(borderLeft+blockWidth/3+blockWidth*i); //angiver hvor på x-aksen der skal startes med at tegne
                y = (int)(dataY[i]*scale);//Angiver højden af søjlerne
                Rectangle blockRec = new Rectangle(x, borderTop+chartHeight-y, blockWidth/2 ,y);
                //blockwidth divideres med to for at lave et mellemrum mellem søjlerne
                g.FillRectangle(blockbr,blockRec);
                //g.WrapMode = WrapMode.TileFlipY;//test
                g.DrawString((dataX[i]/*-1*/ ).ToString(), new Font("Verdana",9,FontStyle.Regular),Brushes.Black, x+blockWidth/4,height-20,salign);
            }
           
            salign.Alignment = StringAlignment.Far;
            //
            for(int i=0; i<intervalsY; i++)
            {
                y = (int)(borderTop + i*(chartHeight/intervalsY));
 
                if(i>0 && i<intervalsY)
                    g.DrawLine(graphPen,rec.Left,y ,rec.Right, y);
                    //Tegner de vandrette linier i grafen.
               
                g.DrawString((max-i*max/intervalsY).ToString(), new Font("Verdana",9,FontStyle.Regular),Brushes.Black, borderLeft,y-7,salign);
            }// end for
           
            salign.Alignment = StringAlignment.Center;
            g.DrawString(strHeadline, new Font("Verdana",12,FontStyle.Bold),Brushes.Black, width/2,0,salign);
          }// end drawHistrogram
    }
}

Jeg vil værdsætte eksempler og evt. forklaringer på bla. Response objektets anvendelse, da jeg som sagt er rookie...
Avatar billede z42cool Nybegynder
03. oktober 2002 - 12:38 #1
Response objektet er egentligt ikke et Response objekt, men et HttpResponse objekt (http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfSystemWebHttpResponseClassTopic.asp). Da den normale adgang til et dette objekt sker gennem Response propertien (kaldet Response for asp 3.0 kompabilitet) på den aktuelle instans af en Page klasse, skal du gøre som følger for at anvende den som parameter:

//I din generelle klasse
using System.Web;

public class MyClass
{
  //Constructor
  public MyClass(HttpResponse response)
  {
    //Brug response her, f.eks.
    response.Write("Hello world!");
  }
}

//Fra din side (aspx eller codebehind)
...
  MyClass myClass = new MyClass(Page.Response);
...
Avatar billede z42cool Nybegynder
03. oktober 2002 - 12:43 #2
public class PMIHistogram {
....
//Ikke længere Page_Load, men nu PMIHistogram constructor
    public PMIHistogram(Page page)
    {           
        b = new Bitmap(width, height, PixelFormat.Format16bppRgb555);           
        page.Response.ContentType= "Image/jpeg";
        page.Session["kvartal"]= "2002 Q2";//midlertidig
        int [,]input= hentPMIVaerdier(Session["kvartal"].ToString());
        Graphics g = Graphics.FromImage(b);           
        doState(input);//forbereder data ud fra input.
        drawHistogram(xVal, yVal, max, width, height, g);//tegner histogram           
        b.Save(page.Response.OutputStream, ImageFormat.Jpeg);             
        b.Dispose();
    }
....
}
Avatar billede llcoolj Nybegynder
03. oktober 2002 - 14:09 #3
Undersøger lige om jeg kan få det til at virke.
Avatar billede llcoolj Nybegynder
03. oktober 2002 - 16:01 #4
Det ser ud til at virke, men mit html fra aspx siden vises ikke, men kun diagrammet- hvad kan det skyldes?

-> z42cool: Du skal nok få point, skal bare lige kontrollere at det hele virker som det skal- desuden håber jeg evt. at du kan hjælpe mig med det nye problem, som gør at jeg ikke kan se mit HTML.
Avatar billede llcoolj Nybegynder
04. oktober 2002 - 12:27 #5
Har løst min visning ved at lave en ny aspx fil der udelukkende laver det image der så vises sammen med mit øvrige HTML.

-> z42cool - tak for hjælpen- skal lige høre om det er to løsninger du har lavet i de to indlæg, da det ihvertfald virker med første løsning(indlæg).
Avatar billede z42cool Nybegynder
04. oktober 2002 - 12:32 #6
Nej, det er én løsning, den 2. post er bare den 1. post udpenslet :-)
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