Простая гистограмма в C # - PullRequest
2 голосов
/ 16 ноября 2011

Я хотел спросить, возможно ли создать две простые полосы, используя MScharts, чтобы они выглядели так:

Снимок экрана 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 Каждый раз, когда я нажимаю кнопку, генерируются новые случайные данные, которые переопределяют старый график.,Тем не менее, есть еще проблема.Красный индикатор должен увеличиваться только тогда, когда было превышено максимальное значение, и это то, что я пытался реализовать с помощью if-запроса в методе OnPaint, однако он все равно будет иногда составлять случайные значения и полностью отключаться, превышая старое значение.даже если новое случайное значение еще ниже ... это не имеет смысла.

Вот проект, если кто-то захочет попробовать и помочь мне: http://up.k10x.net/ambglolrngulg/LevelMeter.zip

Я действительно не знаю, потому чтоКод выглядит правильно для меня.

Ответы [ 2 ]

1 голос
/ 16 ноября 2011

Я бы не использовал для этого mschart. Я бы написал элемент управления для индикатора bar и max, а затем использовал его для другого пользовательского элемента управления, чтобы получить метки и прочее. В прошлом я смотрел, что в .net нет контроля формы, так что это может дать вам несколько подсказок. элемент управления .net с открытым исходным кодом

0 голосов
/ 20 августа 2014

Предоставлено: http://www.dotnetlines.com/Blogs/tabid/85/EntryId/44/Create-a-simple-Column-Chart-Bar-Chart-in-ASP-NET-using-C.aspx

Добавьте следующий httphandler в web.config

<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 для заполненияграфик в элементе управления Chart

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;       

}
...