C#中的简单条形图

时间:2011-11-16 13:41:29

标签: c# graph charts mschart

我想询问是否可以使用MScharts创建两个简单的条形图:

Screen shot http://img16.imageshack.us/img16/4413/desktoptf.png

我想要上面图像的精确复制品,所以没有图表或网格,只需要两个简单的条形图。

另一件事是最大值由条形每端的小红色条纹表示,并应保持在那里直到超过最大值。

我的想法是我正在阅读应该动态应用于条形图的实时数据(4个值)。

那么有人知道如何解决这个问题吗?我目前正在使用MScharts插件(或者使用C#的绘图功能而不是MScharts可能会更好吗?)。

提前致谢。

编辑:

好的,这是我想出的:

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;


namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        bool k = false;
        Random random = new Random();
        int max = 0;

        protected override void OnPaint(PaintEventArgs paintEvnt)
        {
            int i = 30;
            Graphics gfx = paintEvnt.Graphics;
            Pen myPen = new Pen(Color.Black);

                for (i = 40; i < 640; i = i + 100)
                {
                    gfx.DrawLine(myPen, i, 25, i, 35); 
                }

                for (i = 40; i < 640; i = i + 100)
                {
                    gfx.DrawLine(myPen, i, 55, i, 65);
                }

                Color brushColor = Color.FromArgb(0, 0, 255);
                SolidBrush myBrush = new SolidBrush(brushColor);

                    int randomnumber = random.Next(0, 601);
                    gfx.FillRectangle(myBrush, 33, 33, randomnumber, 25);

                    if (randomnumber + 33 > max)
                    {
                        max = randomnumber + 33;
                        gfx.DrawLine(new Pen(Color.Red, 3), max, 30, max, 60);
                    }
                    else
                    {
                        gfx.DrawLine(new Pen(Color.Red, 3), max, 30, max, 60);
                    }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Invalidate();
        }
    }
}

这就是它的样子:http://img411.imageshack.us/img411/5646/graphmj.jpg 每次按下按钮,都会生成新的随机数据并覆盖旧图表。但是,仍然存在问题。 红色指示器应该仅在超过最大值时才会增加,这就是我尝试使用OnPaint方法中的if-query实现的,但它仍然会有时构成随机值并完全关闭,超过旧值虽然新的随机值甚至更低......但没有意义。

继续这个项目,任何人都想尝试并帮助我: http://up.k10x.net/ambglolrngulg/LevelMeter.zip

我真的很无能,因为代码对我来说是正确的。

2 个答案:

答案 0 :(得分:1)

我不会使用mschart。我会编写一个控件来执行bar和max指示器,然后在另一个usercontrol上使用它来获取标签和内容。 最后我看到.net中没有形状控制,所以这可能会给你一些线索。 open source .net shape control

答案 1 :(得分:0)

礼貌:http://www.dotnetlines.com/Blogs/tabid/85/EntryId/44/Create-a-simple-Column-Chart-Bar-Chart-in-ASP-NET-using-C.aspx

在web.config中添加以下httphandler

<httpHandlers>

  <add path="ChartImg.axd"

       verb="GET,HEAD,POST"

       type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler,

       System.Web.DataVisualization,

       Version=4.0.0.0, Culture=neutral,

       PublicKeyToken=31bf3856ad364e35"

       validate="false"/>

</httpHandlers>

页面设计

<%@ Page Title="Home Page" Language="C#" MasterPageFile="~/Site.master" AutoEventWireup="true"

CodeFile="Default.aspx.cs" Inherits="_Default" %>

 <%@ Register TagPrefix="asp" Namespace="System.Web.UI.DataVisualization.Charting"

Assembly="System.Web.DataVisualization,

        Version=4.0.0.0,

        Culture=neutral,

        PublicKeyToken=31bf3856ad364e35" %>

 //Place the chart control on the page as follows.

    <asp:Chart ID="Chart1" runat="server" Height="300px" Width="600px">

        <Titles>

            <asp:Title ShadowOffset="3" Name="Student Marks" />

        </Titles>

        <Legends>

            <asp:Legend Alignment="Center" Docking="Bottom" IsTextAutoFit="False" Name="Legend"

                LegendStyle="Row" />

        </Legends>

        <Series>

            <asp:Series Name="Legend" />

        </Series>

        <ChartAreas>

            <asp:ChartArea Name="studentChartArea" BorderWidth="0" />

        </ChartAreas>

    </asp:Chart>

在CodeBehind中编写以下代码以填充图表控件中的图表

protected void Page_Load(object sender, EventArgs e)

{

    string[] xAxis = { "Student1", "Student2", "Student3", "Student4", "Student5", "Student6" };

    double[] yAxis = { 39, 67, 96, 86, 47, 98 };

    Chart1.Series["Legend"].Points.DataBindXY(xAxis, yAxis);



    Chart1.Series["Legend"].Points[0].Color = Color.Black;

    Chart1.Series["Legend"].Points[1].Color = Color.Bisque;

    Chart1.Series["Legend"].Points[2].Color = Color.Blue;

    Chart1.Series["Legend"].Points[3].Color = Color.BlueViolet;

    Chart1.Series["Legend"].Points[4].Color = Color.Brown;

    Chart1.Series["Legend"].Points[5].Color = Color.CornflowerBlue;



    Chart1.Series["Legend"].ChartType = SeriesChartType.Column;     



    Chart1.ChartAreas["studentChartArea"].Area3DStyle.Enable3D = true;       

}