要用到饼图,不知道用什么实现比较好啊。

解决方案 »

  1.   

    控件用ultra chart应该是可以的。很多控件都支持。
      

  2.   

    http://zedgraph.org
      

  3.   


    public class piechart
        {
            public piechart()
            {
            }
            //render是图形大标题,图开小标题,图形宽度,图形长度,饼图的数据集和饼图的数据集要表示出来的数据 
            public Image render(string title, string subtitle, int width, int height, DataSet chartdata, int dataline)
            {
                const int side_length = 400;
                const int pie_diameter = 200;
                DataTable dt = chartdata.Tables[0];            //通过输入参数,取得饼图中的总基数  
                float sumdata = 0;
                foreach (DataRow dr in dt.Rows)
                {
                    sumdata += Convert.ToSingle(dr[dataline]);
                }
                //产生一个image对象,并由此产生一个graphics对象  
                Bitmap bm = new Bitmap(width, height);
                Graphics g = Graphics.FromImage(bm);
                //设置对象g的属性  
                g.ScaleTransform((Convert.ToSingle(width)) / side_length, (Convert.ToSingle(height)) / side_length);
                g.SmoothingMode = SmoothingMode.Default;
                g.TextRenderingHint = TextRenderingHint.AntiAlias;            //画布和边的设定  
                g.Clear(Color.White);
                g.DrawRectangle(Pens.Black, 0, 0, side_length - 1, side_length - 1);
                //画饼图标题  
                g.DrawString(title, new Font("tahoma", 14), Brushes.Black, new PointF(5, 5));
                //画饼图的图例  
                g.DrawString(subtitle, new Font("tahoma", 12), Brushes.Black, new PointF(7, 35));
                //画饼图  
                float curangle = 0;
                float totalangle = 0;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    curangle = Convert.ToSingle(dt.Rows[i][dataline]) / sumdata * 360;                g.FillPie(new SolidBrush(chartutil.getchartitemcolor(i)), 100, 65, pie_diameter, pie_diameter, totalangle, curangle);
                    g.DrawPie(Pens.Black, 100, 65, pie_diameter, pie_diameter, totalangle, curangle);
                    totalangle += curangle;
                }
                //画图例框及其文字  
                g.DrawRectangle(Pens.Black, 200, 300, 199, 99);
                g.DrawString("图表说明", new Font("tahoma", 12, FontStyle.Bold), Brushes.Black, new PointF(200, 300));            //画图例各项  
                PointF boxorigin = new PointF(210, 330);
                PointF textorigin = new PointF(235, 326);
                float percent = 0;
                for (int i = 0; i < dt.Rows.Count; i++)
                {
                    g.FillRectangle(new SolidBrush(chartutil.getchartitemcolor(i)), boxorigin.X, boxorigin.Y, 20, 10);
                    g.DrawRectangle(Pens.Black, boxorigin.X, boxorigin.Y, 20, 10);
                    percent = Convert.ToSingle(dt.Rows[i][dataline]) / sumdata * 100;
                    g.DrawString(dt.Rows[i][1].ToString() + " - " + dt.Rows[i][0].ToString() + " (" + percent.ToString("0") + "%)", new Font("tahoma", 10), Brushes.Black, textorigin);
                    boxorigin.Y += 15;
                    textorigin.Y += 15;
                }
                //回收资源  
                g.Dispose();
                return (Image)bm;        }
        }DataSet chartdata就是数据项 你也可以换成数组来存储数据。
      

  4.   


     public class PieChart
        {
            public PieChart()
            {
            }
        
            //render是图形大标题,图开小标题,图形宽度,图形长度,饼图的数据集和相应的事件. 
            public Image render(string title, string subtitle, int width, int height, int[] chartdata)
            {          
                    const int side_length = 400;
                    const int pie_diameter = 200;
                    int[] dt = chartdata;                //通过输入参数,取得饼图中的总基数  
                    float sumdata = 0;
                    foreach (int dr in dt)
                    {
                        sumdata += dr;
                    }             
                    //产生一个image对象,并由此产生一个graphics对象  
                    Bitmap bm = new Bitmap(width, height);
                  Graphics g = Graphics.FromImage(bm);                try
                    { 
                    //设置对象g的属性  
                    g.ScaleTransform((Convert.ToSingle(width)) / side_length, (Convert.ToSingle(height)) / side_length);
                    g.SmoothingMode = SmoothingMode.Default;
                    g.TextRenderingHint = TextRenderingHint.AntiAlias;                //画布和边的设定  
                    g.Clear(Color.White);
                    g.DrawRectangle(Pens.Black, 0, 0, side_length - 1, side_length - 1);
                    //画饼图标题  
                    g.DrawString(title, new Font("tahoma", 14), Brushes.Black, new PointF(5, 5));
                    //画饼图的图例  
                    g.DrawString(subtitle, new Font("tahoma", 12), Brushes.Black, new PointF(7, 35));
                    //画饼图  
                       
                    float curangle = 0;
                    float totalangle = 0;
                    for (int i = 0; i < dt.Length; i++)
                    {
                        curangle = Convert.ToSingle(dt[i]) / sumdata * 360;                    g.FillPie(new SolidBrush(ChartUtil.getchartitemcolor(i)), 100, 65, pie_diameter, pie_diameter, totalangle, curangle);
                        g.DrawPie(Pens.Black, 100, 65, pie_diameter, pie_diameter, totalangle, curangle);
                        totalangle += curangle;
                    }
                    //画图例框及其文字  
                    g.DrawRectangle(Pens.Black, 200, 300, 199, 99);
                    g.DrawString("图表说明", new Font("tahoma", 12, FontStyle.Bold), Brushes.Black, new PointF(200, 300));                //画图例各项  
                    PointF boxorigin = new PointF(210, 330);
                    PointF textorigin = new PointF(235, 326);
                    float percent = 0;
                    for (int i = 0; i < dt.Length; i++)
                    {
                        g.FillRectangle(new SolidBrush(ChartUtil.getchartitemcolor(i)), boxorigin.X, boxorigin.Y, 20, 10);
                        g.DrawRectangle(Pens.Black, boxorigin.X, boxorigin.Y, 20, 10);
                        percent = Convert.ToSingle(dt[i]) / sumdata * 100;
                        g.DrawString(dt[i].ToString() + " - " + dt[i].ToString() + " (" + percent.ToString("0") + "%)", new Font("tahoma", 10), Brushes.Black, textorigin);
                        boxorigin.Y += 15;
                        textorigin.Y += 15;
                    }
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.TargetSite.ToString());
                }
                return (Image)bm;
            }
        }
    换成数组来存储数据。