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...
