Avatar billede llcoolj Nybegynder
08. oktober 2002 - 10:46 Der er 14 kommentarer og
1 løsning

Opdatering af image

Halløjsa,
        er der nogen derude der ved hvordan man opdaterer et image? Jeg har i min codebehind fil en Page_Load der undersøger på en Session, hvilken constructor der skal kaldes. Mit problem er når jeg på min grænseflade vil skifte ml. to visninger der anvender samme aspx fil til at generere et image- opdateres dette image ikke.

Aspx fil med html specifikt for den enkélte side:
- her har jeg bare lavet et image med ImageGenerator.aspx som URL.

ImageGenerator.aspx:
<%@ Page Language="C#" Inherits="PCV.ModulBKontrol" codebehind="ModulBKontrol.cs" Trace="true" Debug="True" %>
<%@ import Namespace="PCV" %>

ModulBKontrol.cs:
Her undersøges på session - og constructor fra anden cs fil kaldes...
public void Page_Load(Object sender, EventArgs e)
    { 
    if(Session["modulB"].Equals("b7)
      {
          int [,]input= r.hentPMIVaerdier 
              (Session["kvartalsVariabel"].
              ToString());       
              string []projNavn =  p.hentProjektNavn  (input);   
      PMIHistogram p = new PMIHistogram (Page.Response, input, projNavn);
      }//ends if
     
      else if(Session["modulB"].Equals("b1"))
      {
            int [,]kontraktSummer = r.hentKontraktsum(Session["kvartalsVariabel"].ToString());
            Trace.Write("hentkontraktsum 2 i kontrol");
            string[] projNavne = hentProjektNavn(kontraktSummer);                       
            Histogram h = new Histogram(Page.Response, kontraktSummer, projNavne);           
      }   
    }//ends Page_Load
Avatar billede nute Nybegynder
08. oktober 2002 - 10:54 #1
du setter dit image ind til at "runat='server'" ... deretter kan du bare sette sourcen til billeded i code-behind filen

/nute
Avatar billede llcoolj Nybegynder
08. oktober 2002 - 11:14 #2
Men min source er bare aspx filen der genererer billedet... Derfor kan jeg vel ikke gøre dette, da det er den der har codebehind filen. Det virker ihvertfald ikke :-(
Avatar billede llcoolj Nybegynder
08. oktober 2002 - 11:19 #3
Kan man ikke på nogen måde bare fortælle at når aspx filen loades skal imagegenerator.aspx filen igen generere et image ved igen at loade den arvede Page_Load fra code behind filen?
Avatar billede nute Nybegynder
08. oktober 2002 - 11:28 #4
uha ... det lyder som noe indviklet noget ... :-|

Hvorfor gøre det vanskelig ?? Jeg kan umiddelbart se mange mulige løsninger. Det er jo også litt svært å svare på når du har to objekter som vi ikke ser indholdet av, PMIHistogram og Histogram. Hvorfor sender du Page.Response med til disse objekter istedenfor at bruge Response.Write( new Histogram(...) ) ??

Hvis du *vet* du skal ha et billede på din side, hvorfor laver du så mange lag af abstraktioner ?

/nute
Avatar billede llcoolj Nybegynder
08. oktober 2002 - 11:47 #5
Ok- måske er det ikke det mest hensigtsmæssige design, men det var nu ment sådan.

1). I de to histogram klasser tegnes histogrammet og til dette skal response objektet anvendes.
2). Mente at den ekstra abstraktion var det pæneste design m. henblik på genbrug.

Her er constructoren fra den ene histogram klasse(de to ligner hinanden meget:

public Histogram(HttpResponse response, int[,] inputValues, string[]projNavn)
        {     
            b = new Bitmap(width, height, PixelFormat.Format16bppRgb555);
            response.ContentType= "Image/jpeg";
            Graphics g = Graphics.FromImage(b);           
           
            Trace.Write("Constructor: 1");
           
            doState(inputValues, projNavn);//forbereder data ud fra input.
           
            Trace.Write("Constructor: 2");
           
            drawHistogram(xVal, yVal, max, width, height, g);//tegner histogram           
            b.Save(response.OutputStream, ImageFormat.Jpeg);
            b.Dispose();
        }//ends PMIHistogram constructor
Avatar billede nute Nybegynder
08. oktober 2002 - 12:04 #6
jeg ville nok lage en løsning hvor Histogram klassen(e) bare var noen selvstendige klasser og som hadde en metode som returnerte et HtmlImage, og gjort noe ála:

HISTOGRAM.CS:
*************
using System.Web.UI.HtmlControls;

public class Histogram
{
    private HtmlImage htmlImage = null;
    public Histogram( int[] i, string[] s)
    {
      this.htmlImage = new HtmlImage();
      ....
    }

    publig HtmlImage getImage()
    {return this.htmlImage;}
}

if(Session["modulB"].Equals("b7)
      {
          int[,] input= r.hentPMIVaerdier(Session["kvartalsVariabel"].
              ToString());       
          string []projNavn =  p.hentProjektNavn (input);   
          PMIHistogram p = new PMIHistogram(input, projNavn);
Response.Write( p.getImage() );
      }//

*meget* penere ... så slipper du for at skulle behandle Page.Response halløjs lenger nede enn første abstraktions niveau. Hvis du snakker om genbrug ... hvorfor laver du så ikke en klasse som både PMIHistogram og Histogram arver fra ? så slipper du iallefall å skrive den samme funktionalitet 2 ganger.

/nute
Avatar billede llcoolj Nybegynder
08. oktober 2002 - 12:39 #7
Ang. det html image, så kan jeg ikke lige gennemskue hvordan jeg får tegnet dette. Desuden er jeg rookie i asp.net og vil helst ikke lave alt for meget om i mine klasser med mindre jeg kan få eksempler som jeg kan gennemskue...
Er det ikke muligt at fortælle den klasse der genererer mit image, at den skal loades igen?
Med hensyn til de to histogrammer er de ikke delt op, da der er væsentlige forskelle i netop tegningen af den i drawHistogram(...) metoden, men ellers skal Histogram også være generel for andre histogrammer når jeg får løst dette problem.
Avatar billede nute Nybegynder
08. oktober 2002 - 13:23 #8
hvis du er en rookie i asp.net, så ville jeg ihvertfall lyttet til de tips som du fikk. Hvis du ikke vil ta imot tipsene, så er det ikke så meget hjelp i å spørre ?! ;-)

"Er det ikke muligt at fortælle den klasse der genererer mit image, at den skal loades igen?" .... ehhh ... nei, det lyder da som en merkelig og ikke særlig smart/holdbar/mulig løsning.

Jeg vil nok påstå at du som rookie har rotet deg ut i en gal retning. Du tenker *for* kompleks. Det er en simpel løsning til ditt problem (etter dét jeg kan forstå).

/nute
Avatar billede llcoolj Nybegynder
08. oktober 2002 - 14:23 #9
Jeg kan løse mit problem ved at lave en imagegenerator klasse for hvert image jeg vil vise, men syntes det lyder mærkeligt at man ikke kan opdatere mit image eller reloade Page_Load i code behind filen.
Har lige leget lidt med tanken om at billedet bliver gemt i cachen og jeg således kunne sætte denne tid til 1 sekund el. lign.
Avatar billede llcoolj Nybegynder
08. oktober 2002 - 14:31 #10
Pointene er dine hvis du kan fortælle mig hvordan jeg får tegnet det html-image ud fra min nuværende histogram klasse...

public class Histogram : Page{
        //private Rapport r = new Rapport();
        //private Projekt p = new Projekt();
        private int height = 300;
        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.
             
        //PMIHistogram constructor
        public Histogram(HttpResponse response, int[,] inputValues, string[]projNavn)
        {     
            b = new Bitmap(width, height, PixelFormat.Format16bppRgb555);
            response.ContentType= "Image/jpeg";
            Graphics g = Graphics.FromImage(b);           
           
            Trace.Write("Constructor: 1");
           
            doState(inputValues, projNavn);//forbereder data ud fra input.
           
            Trace.Write("Constructor: 2");
           
            drawHistogram(xVal, yVal, max, width, height, g);//tegner histogram           
            b.Save(response.OutputStream, ImageFormat.Jpeg);
            b.Dispose();
        }//ends PMIHistogram constructor
     
        public void doState(int [,]data, string[] proj)
        //Pre:  None
        //Post: Y-aksen er tilpasset værdierne i [0,x]data
        {
            //int[] temp= new int[data[3,0]];//antal elementer i array.
            Trace.Write("DoState: 1");
           
            yVal=new int[data[2,0]];
         
            Trace.Write("DoState: 1");
           
            //Fylder yVal og xVal
            for(int i=0; i<data[2,0]; i++)
            {
                yVal[i]=data[0,i];
              // yVal[1,i]=data[3,i];
                //xVal[i]=proj[i]; 
            }           
           
            Trace.Write("yVal[0] = "+yVal[0]);
           
            xVal=proj;           
           
            Trace.Write("DoState: 3");
           
            //sætter en dynamisk værdi for histogrammets bredde 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=60;
            borderRight=10;
            borderTop=20;
            borderBottom=100;
            //Boolean sat=false;
            string strHeadline = "Histogram";
            int intervalsY = max;//antal intervaller i vandrette gridlinier
            //Laver y-aksens højde mindre, hvis den er større end 10
           
            //Tilpasser intervallet angivet på y-aksen dynamisk
            //Skal eventuelt deles op i mindre intervaller.
            if(0<max&&max<10)
                intervalsY=(int)(max/2);
               
            else if(10<max&&max<50)
                intervalsY=(int)(max/5);
               
            else if(50<max&&max<350)
                intervalsY=(int)(max/25);
               
            else if(350<max&&max<2500)
                intervalsY=(int)(max/175);
               
            else if(2500<max&&max<18000)
                intervalsY=(int)(max/1250);
               
            else if(18000<max&&max<130000)
                intervalsY=(int)(max/5);
               
            else if(130000<max&&max<1000000)
                intervalsY=(int)(max/75000);
               
            else
                intervalsY=(int)(max/100000);
           
            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 hvid horisontalt
            g.FillRectangle(lb,rec);
            g.DrawRectangle(borderPen,rec);
           
            StringFormat salign = new StringFormat();
            salign.Alignment = StringAlignment.Near;
            LinearGradientBrush blockbr = new LinearGradientBrush(rec, Color.Yellow,Color.Red,LinearGradientMode.Vertical);
            //her(Count = Length
            int blockWidth = (int)(chartWidth / (dataX.Length));
            double scale = (double)chartHeight/max;
           
            int x, y;           
           
            salign.FormatFlags = StringFormatFlags.DirectionVertical;
           
            //For hver gennemløb tenes der en Søjle.           
            for(int i=0; i<dataX.Length; i++)
            {           
                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);
                //Tegner projektnavnene under søjlerne
                g.DrawString((dataX[i] ).ToString(), new Font("Verdana",9,FontStyle.Regular),Brushes.Black, x+blockWidth/4,height-100,salign);
            }
                salign.Alignment = StringAlignment.Far;
                salign.FormatFlags = StringFormatFlags.NoWrap;
         
            for(int i=0; i<intervalsY; i++)
            { 
                float gridY = (float)(borderTop + i*((float)chartHeight/intervalsY));
                         
                if(i>0 && i<intervalsY)
                    g.DrawLine(graphPen,rec.Left,gridY ,rec.Right, gridY);
                    //Tegner de vandrette linier i grafen.
               
                g.DrawString((max-i*max/intervalsY).ToString(), new Font("Verdana",9,FontStyle.Regular),Brushes.Black, borderLeft,gridY-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
    }
}


Det er muligt at det er for komplekst, og er meget lydhør overfor forslag til bedre løsninger. Jeg vil bare gerne forstå dem også :-P
Avatar billede nute Nybegynder
08. oktober 2002 - 14:45 #11
hmmm...det var noe værre kode. Er det deg selv som har skrevet dette ? Eller er det noe copy/paste arbeide ?

Jeg kan desverre ikke sette meg inn i ditt problem, da jeg ikke har hele ditt system eller tid. En annen ting er at jeg ikke har arbeidet så meget med generering av grafikk, men det ser umiddelbart litt merkelig ut det som du har skrevet, men igjen ... kan jo være fordi jeg ikke har så meget erfaring med å generere grafikk.

/nute
Avatar billede llcoolj Nybegynder
08. oktober 2002 - 15:44 #12
....syntes du! Selve grafik delen skulle være ok, eftersom den er udarbejdet efter et eksempel fundet på asp.net(tror det var der jeg fandt det).
Forstår godt at du ikke sådan lige kan/har tid til at sætte dig ind i det, så jeg løser det bare ved at lave en separat imagegenerator klasse for hver histogram jeg vil vise, men du skal have tak for dine forsøg- evt. hvis du har et eks. hvor du har anvendt et htmlImage- kunne jeg måske forstå hvordan det anvendes....

Du får ½ delen af pointene for at forsøge...

-takker
Avatar billede llcoolj Nybegynder
08. oktober 2002 - 15:46 #13
Men så skal du lige lægge et svar :-)
Avatar billede nute Nybegynder
08. oktober 2002 - 15:47 #14
jeg har ikke et spesifikt eksempel hvor jeg har brugt HtmlImage ... sorry ...

Du må gerne beholde dine points :-)

/nute
Avatar billede llcoolj Nybegynder
08. oktober 2002 - 16:55 #15
Ok- takker for din hjælp
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