Histogram
Fila Default.aspx definerer det bildet vi skal vise fram slik:
<asp:Image ID="Image1" runat="server" ImageUrl="bildetest.gif"
AlternateText="Histogram"
Width="286px" Height="271px"/>
Default.aspx er i sin helhet slik:
<%@ Page Language="C#" AutoEventWireup="true"
CodeFile="Default.aspx.cs" Inherits="_Default" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>Histogram</title>
</head>
<body>
<h1>Lag histogram</h1>
<form id="form1" runat="server">
<table>
<tr>
<td><div>
<asp:TextBox ID="TextBox1" runat="server" Rows="12"
TextMode="MultiLine"
Font-Size="Large" Width="128px"></asp:TextBox>
</div>
<div>
<asp:Button ID="Button1" runat="server" Text="Lag histogram"
onclick="Button1_Click" />
</div>
</td>
<td>
<asp:Image ID="Image1" runat="server"
ImageUrl="~/bilde.gif"
AlternateText="Histogram"
Width="286px" Height="271px"/>
</td>
</tr>
</table>
<div>
<asp:Label ID="LabelMsg" runat="server" Text=":">
</asp:Label>
</div>
</form>
</body>
</html>
Kodefila, default.aspx.cs definerer et konstant filnavn:
protected String BildeFilename = "bildetest.gif";
Det er laget to rutiner for å administrere selve bildefila:
protected void DeletFile()
{
// make sure we have permission to to this
try
{
File.Delete(BildeFile);
}
catch (Exception dex)
{
LabelMsg.Text = dex.Message;
}
}
For å unngå at vi kommer opp med gamle data når vevsiden åpnes er følgende lagt inn i Page_Load.
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
DeletFile();
}
Hovelogikken ligger i koden bak button "Lag histogram":
protected void Button1_Click(object sender, EventArgs e)
{
// pick up data from textbox and make data
LabelMsg.Text = ":";
String[] lines = TextBox1.Text.Split('\r');
List<int> data = new List<int>(lines.Length);
try
{
foreach (string line in lines)
if (line.Trim().Length > 0)
data.Add(Convert.ToInt32(line.Trim()));
}
catch (Exception ex)
{
DeletFile();
LabelMsg.Text = "bad format";
data = null;
}
if (data != null)
{
// we draw on a bitmap and saves it
Rectangle Rec = new Rectangle(0, 0,
Convert.ToInt32(Image1.Width.Value),
Convert.ToInt32(Image1.Height.Value));
Bitmap canvas = new Bitmap(Rec.Width, Rec.Height,
PixelFormat.Format16bppRgb555);
Graphics cg = Graphics.FromImage(canvas);
cg.FillRectangle(Brushes.White, Rec);
// the actual drawing
drawData(cg, Rec, data);
// save the drawing as a (temporary) file
// make sure permissions on server is sufficient
try
{
canvas.Save(BildeFile, ImageFormat.Gif);
}
catch (Exception sex)
{
// if image is too large
// if not write permissions
LabelMsg.Text = sex.Message;
}
}
Image1.ImageUrl = Rel_BildeFile;
Image1.AlternateText = "Histogram";
}
Selve uttegningen er slik som i modulen: Histogram
// draw data within Rec on g
private void drawData(Graphics g, Rectangle Rec, List<int> data)
{
Font tFont = new Font("Arial", 16);
SolidBrush blueBrush = new SolidBrush(Color.Blue);
// any data to display
if ((data==null) ||(data.Count == 0))
{
g.DrawString(" Ingen data ",
tFont,
blueBrush,
new Point(10, 4));
}
else
{
// find max value
float max = 0.0F;
foreach (int number in data)
max = Math.Max((float)number, max);
// Width of each column, with some margins
int w =
(Rec.Width - 10 * data.Count - 20) / data.Count;
// flip round top and leave some room at top for text
int txtheight = 20;
g.ResetTransform();
g.TranslateTransform(0.0F, Rec.Height);
g.ScaleTransform(1.0F,
-1.0F * ((Rec.Height - txtheight) / (max + 1)));
for (int ix = 0; ix < data.Count; ix++)
{
g.FillRectangle(Brushes.Red,
new Rectangle(10 + ix * (w + 10), 0, w, data[ix]));
}
// text it
g.ResetTransform();
g.DrawString("Resultater",
tFont, blueBrush, new Point(10, 4));
}
g.Flush();
}