C# 折線圖

C# 折線圖和程式碼

參考來源:
http://www.diybl.com/course/4_webprogram/asp.net/asp_netshl/2008124/97074.html
工具pictureBox、dataGridView

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Drawing.Imaging;
using System.Drawing.Drawing2D;
 
 
 
namespace testP
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            #region 準備預設顯示資料
            DataSet ds = new DataSet();
            DataTable dt = new DataTable("matr");
            dt.Columns.Add("id", typeof(string));
            dt.Columns.Add("val", typeof(string));
 
            DataRow dr1 = dt.NewRow();
            dr1["id"] = "3/01";
            dr1["val"] = "50";
            dt.Rows.Add(dr1);
 
            DataRow dr2 = dt.NewRow();
            dr2["id"] = "3/05";
            dr2["val"] = "30";
            dt.Rows.Add(dr2);
 
            DataRow dr3 = dt.NewRow();
            dr3["id"] = "3/13";
            dr3["val"] = "45";
            dt.Rows.Add(dr3);
 
            DataRow dr4 = dt.NewRow();
            dr4["id"] = "3/16";
            dr4["val"] = "10";
            dt.Rows.Add(dr4);
 
            DataRow dr5 = dt.NewRow();
            dr5["id"] = "3/20";
            dr5["val"] = "35";
            dt.Rows.Add(dr5);
 
            DataRow dr6 = dt.NewRow();
            dr6["id"] = "3/25";
            dr6["val"] = "60";
            dt.Rows.Add(dr6);
 
            DataRow dr7 = dt.NewRow();
            dr7["id"] = "3/27";
            dr7["val"] = "50";
            dt.Rows.Add(dr7);
 
            DataRow dr8 = dt.NewRow();
            dr8["id"] = "3/29";
            dr8["val"] = "55";
            dt.Rows.Add(dr8);
 
            ds.Tables.Add(dt);
            BindingSource bs = new BindingSource(ds, "matr");
 
            dataGridView1.DataSource = bs;
 
            #endregion
 
 
            #region DataTable轉Array
            int r = ds.Tables["matr"].Rows.Count;
            string[] month = new string[r];
            double[] d = new double[r];
            for (int k = 0; k < r; k++)
            {
                month[k] =  Convert.ToString(ds.Tables["matr"].Rows[k]["id"]);
                d[k]  = Convert.ToDouble(ds.Tables["matr"].Rows[k]["val"]);
            }
            #endregion
 
 
            //圖初始化    
            Bitmap bMap = new Bitmap(350, 280);
            Graphics gph = Graphics.FromImage(bMap);
            gph.Clear(Color.White);
 
            //長條圖
            //Brush aa =new SolidBrush (Color.Blue);
            //gph.FillRectangle(aa, 10, 10, 20, 100);
 
            // 定義描繪區域
            Rectangle rect = new Rectangle(20, 40, 270, 200);
            // 建立45度漸層的筆刷
            LinearGradientBrush lgb = new LinearGradientBrush(
             rect,
             Color.Cyan,
             Color.White,
             90f
            );
            // 使用漸層化刷填滿工作區
            gph.FillRectangle(lgb, rect);  
 
 
            //中心點 
            PointF cPt = new PointF(20, 240);
 
            //X軸三角形
            PointF[] xPt = new PointF[3]
            {
                new PointF(cPt.Y+56, cPt.Y),
                new PointF(cPt.Y+50, cPt.Y-4),
                new PointF(cPt.Y+50, cPt.Y+4)
            };
 
            //Y軸三角形
            PointF[] yPt = new PointF[3]
            {
                new PointF(cPt.X, cPt.X+14),
                new PointF(cPt.X+4, cPt.X+20),
                new PointF(cPt.X-4, cPt.X+20)
            };
 
            //標題  
            gph.DrawString("圖表", new Font("標楷體", 14), Brushes.Black,
                           new PointF(cPt.Y / 2 + cPt.X, cPt.X - 10));
 
            //畫X軸線  
            gph.DrawLine(Pens.Black, cPt.X,
                                     cPt.Y,
                                     cPt.Y + 50, 
                                     cPt.Y);
            gph.DrawPolygon(Pens.Black, xPt);
            gph.FillPolygon(new SolidBrush(Color.Black), xPt);
            gph.DrawString("月份", new Font("標楷體", 10), Brushes.Black,
                           new PointF(cPt.Y + 56, cPt.Y - 8));
 
            //畫Y軸線 
            gph.DrawLine(Pens.Black, cPt.X, 
                                     cPt.Y,
                                     cPt.X, 
                                     cPt.X + 20);
            gph.DrawPolygon(Pens.Black, yPt);
            gph.FillPolygon(new SolidBrush(Color.Black), yPt);
            gph.DrawString("單位", new Font("標楷體", 10), Brushes.Black,
                           new PointF(5, cPt.X - 2));
 
            //畫Y軸刻度   
            for (int j = 1; j <= 7; j++)
            {
                gph.DrawString((j * 10).ToString(), new Font("標楷體", 8), Brushes.Black,
                                new PointF(cPt.X - 18, cPt.Y - j * 25 - 6));
                gph.DrawLine(Pens.Black, cPt.X - 3,
                                         cPt.Y - j * 25,
                                         cPt.X, 
                                         cPt.Y - j * 25);
            }
 
            //畫X軸項目  
            for (int i = 1; i <= r; i++)
            {
                gph.DrawString(month[i - 1], new Font("標楷體", 8), Brushes.Black,
                               new PointF(cPt.X + i * 30 - 16, cPt.Y + 7));  //month[i - 1].Substring(0, 1); 取第一個字寫法
 
                gph.DrawLine(Pens.Black, cPt.X + i * 30 - 5, 
                                         cPt.Y,
                                         cPt.X + i * 30 - 5, 
                                         cPt.Y + 4);
 
                //畫點 
                gph.DrawEllipse(Pens.Red, cPt.X + i * 30 - 6,
                                            cPt.Y - (float)d[i - 1] * 2.5f - 1,
                                            3,
                                            3);
                gph.FillEllipse(new SolidBrush(Color.Red), cPt.X + i * 30 - 6, 
                                                           cPt.Y - (float)d[i - 1] * 2.5f - 1,
                                                           3, 
                                                           3);
 
                //畫數值    
                gph.DrawString(d[i - 1].ToString(), new Font("標楷體", 8), Brushes.Black,
                new PointF(cPt.X + i * 30, cPt.Y - (float)d[i - 1] * 2.5f - 1));
 
                //折線    
                if (i > 1)
                {
                    Pen myPen = new Pen(Color.Red);
                    gph.DrawLine(myPen, cPt.X + (i - 1) * 30 - 4, 
                                        cPt.Y - (float)d[i - 2] * 2.5f - 1,
                                        cPt.X + i * 30 - 4, 
                                        cPt.Y - (float)d[i - 1] * 2.5f - 1);
                }
 
            }
 
            //顯示
            this.pictureBox1.Image = bMap;
 
            //存圖片至本機   
            //bMap.Save("c:\\test.bmp");  
        }
    }
}