以下は、データセット内のデータから生成されたグラフです。
私のDatasetはテーブルSendrecから読み込んだデータで、Id、Sendid(注文番号)、Sendtime(記録時間)、Sendnum(私の場合は単位時間/5分あたりの送信量)などのいくつかのフィールドがあり
ます。次のように:
public voiddraw(Page page,DataSet ds,int Tnum){}
このページは、このプロセスを参照するページを渡すために使用され、ページは生成された曲線グラフを JPG モードでクライアントに直接出力できます。
ds は抽出されたデータセットです。
Tnum はここで使用したい単なるパラメータです。このクラスを読み取りプロセスに公開したくないので、注文の合計金額を直接取得して渡します。
システムを使用する;
System.Data を使用します。
System.Configuration を使用します。
System.Web を使用します。
System.Web.Security を使用します。
System.Web.UI を使用します。
System.Web.UI.WebControls を使用する;
System.Web.UI.HtmlControls を使用する。
System.Drawing.Drawing2D を使用します。
System.Drawing.Imaging を使用します。
System.Drawing を使用します。
System.IO を使用します。
パブリッククラスimgdraw
{
パブリック imgdraw()
{
}
public voiddraw(Page page,DataSet ds,int Tnum)
{
//レコード数を取得する
int count = ds.Tables[0].Rows.Count;
//チャートの幅を計算する
int wd = 80 + 20 * (カウント - 1);
//最小幅を 800 に設定します
if (wd < 800) wd = 800;
//ビットマップオブジェクトを生成
ビットマップ img=新しいビットマップ(wd,400);
//描画オブジェクトを生成
グラフィックス g = Graphics.FromImage(img);
//黒ブラシを定義
ペン Bp = 新しいペン(Color.Black);
// 赤いブラシを定義します
ペン Rp = 新しいペン(Color.Red);
//シルバーグレーのブラシを定義
ペン Sp = 新しいペン(Color.Silver);
// タイトルのフォントを定義する
Font Bfont = new Font("Arial", 12, FontStyle.Bold);
//一般的なフォントを定義する
フォント font = new Font("Arial", 6);
// 大きなフォントを定義する
フォント Tfont = new Font("Arial", 9);
//背景色を描画します
g.DrawRectangle(new Pen(Color.White, 400), 0, 0, img.Width, img.Height);
//黒のトランジションブラシを定義
LinearGradientBrush ブラシ = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Black, Color.Black, 1.2F, true);
//青いトランジションブラシを定義
LinearGradientBrush Bluebrush = new LinearGradientBrush(new Rectangle(0, 0, img.Width, img.Height), Color.Blue, Color.Blue, 1.2F, true);
// 大きなタイトルを描画します
g.DrawString(ds.Tables[0].Rows[0]["sendid"].ToString() + "注文配送状況曲線", Bfont, Brush, 40, 5);
// 現在の送信量を取得する
int nums=0;
for (int i = 0; i < count; i++)
{
nums+=Convert.ToInt32(ds.Tables[0].Rows[i]["sendnum"]);
}
//情報説明会を描く
string info="注文送信時刻:"+ds.Tables[0].Rows[0]["sendtime"].ToString()+" 曲線生成時刻: "+DateTime.Now.ToString()+" 注文合計金額: "+Tnum.ToString()+" 現在の送信合計金額: "+nums.ToString();
g.DrawString(info, Tfont, Bluebrush, 40, 25);
//画像の枠線を描画します
g.DrawRectangle(Bp, 0, 0, img.Width - 1, img.Height - 1);
//垂直座標線を描画します
for (int i = 0; i < count; i++)
{
g.DrawLine(Sp, 40+20 * i, 60, 40+20 * i, 360);
}
//タイムライン座標ラベルを描画します
for (int i = 0; i < count; i+=2)
{
string st = Convert.ToDateTime(ds.Tables[0].Rows[i]["sendtime"]).ToString("hh:mm");
g.DrawString(st, フォント, ブラシ, 30 + 20 * i, 370);
}
//水平座標線を描画します
for (int i = 0; i < 10; i++)
{
g.DrawLine(Sp, 40, 60+30*i, 40+20*(count-1), 60+30*i);
int s = 2500 - 50 * i * 5;
//送金量軸座標ラベルを描画
g.DrawString(s.ToString(), フォント, ブラシ, 10, 60 + 30 * i);
}
//縦軸を描画します
g.DrawLine(Bp, 40, 55, 40, 360);
//横軸を描画します
g.DrawLine(Bp, 40, 360, 45 + 20 * (count - 1), 360);
// 曲線の転換点を定義します。
ポイント[] p = 新しいポイント[カウント];
for (int i = 0; i < count; i++)
{
p[i].X = 40 + 20 * i;
p[i].Y = 360- Convert.ToInt32(ds.Tables[0].Rows[i]["sendnum"]) / 5*3/5;
}
//送信カーブを描く
g.DrawLines(Rp, p);
for (int i = 0; i < count; i++)
{
//送信レコードポイントの送信量を描画
g.DrawString(ds.Tables[0].Rows[i]["sendnum"].ToString(), フォント、Bluebrush、p[i].X、p[i].Y - 10);
//送信レコードポイントを描画します
g.DrawRectangle(Rp, p[i].X - 1, p[i].Y - 1, 2, 2);
}
//垂直座標のタイトルを描画します
g.DrawString("送信量", Tfont, ブラシ, 5, 40);
//横軸のタイトルを描画します
g.DrawString("送信時刻", Tfont, ブラシ, 40, 385);
//描いた絵を保存
MemoryStream ストリーム = new MemoryStream();
img.Save(ストリーム, ImageFormat.Jpeg);
//画像出力
page.Response.Clear();
page.Response.ContentType = "画像/jpeg";
ページ.Response.BinaryWrite(stream.ToArray())
;
}
ちょっと、これは絵の描き方の記録です。まだ間違いがたくさんあるので、アドバイスをいただければ幸いです。
http://www.cnblogs.com/aowind/archive/2006/11/23/569536.html