65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 ASP.NET 2.0 进行专业 3D 图表报告 - 第三部分

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.91/5 (15投票s)

2009年10月25日

CPOL

4分钟阅读

viewsIcon

70953

downloadIcon

2718

本文重点介绍通过图表报告实现内部供应链管理的可见性,并提供评估工具来管理和监控业务流程中产生的活动,从而为及时、准确的业务决策铺平道路。

引言

本文重点介绍内部供应链管理流程的可见性。它是《内部供应链可见性》的续篇。在本文中,目标是使用 MSChart 实现,从而提供评估工具。该解决方案包括柱状图、折线图、面积图、饼图、帕累托图和 Kagi 图。这些图表根据其各自的属性进一步细分。

报告分为隔离报告、累积报告和变化率报告。隔离报告提供特定项目或商品的上下文,在此上下文中,存在另一个子上下文来分析该项目或材料。累积报告提供所有项目的上下文,或者将项目上下文移至侧边。

隔离报告和累积报告进一步分为隔离成本、隔离数量、累积成本和累积数量。

外部工作

在项目中添加 System.Web.UI.DataVisualization.Charting 引用,并打开 Web.config 文件添加以下行

system.web/httpHandlers 中,添加此项

<httpHandlers>
    <add path="ChartImg.axd" verb="GET,HEAD" 
        type="System.Web.UI.DataVisualization.Charting.ChartHttpHandler, 
              System.Web.DataVisualization, Version=3.5.0.0, Culture=neutral, 
              PublicKeyToken=31bf3856ad364e35" 
        validate="false"/>
</httpHandlers>

我需要在同一页面上生成 200 多个报告,因此我无法将每个报告都放在单独的页面上。这种技术有些奇怪但非常有效。它有效地分离了表示层和业务层。用于控件工作的代码如下所示。此代码仅管理 ISCMS.Main.Chart 对象,并为其提供参数,或者初始化此对象的属性,这些属性定义了图表的类型、周期和样式。生成报告所需的所有属性都设置在这里。

<script runat="server">
    ISCMS.Main.Chart chy = new ISCMS.Main.Chart();
    bool IsAllowed = false;
    
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            SetRadio();
        }
    }

    void SetRadio()
    {
        if (radProcurement.Checked)
            chy._plantSegment = ISCMS.Main.PlantSegregation.PlantSegment.Procurement;
        if (radWarehouse.Checked)
            chy._plantSegment = ISCMS.Main.PlantSegregation.PlantSegment.Warehouse;

        if (radSegregatedCost.Checked)
        {
            chy._chartBy = ISCMS.Main.PlantSegregation.ChartBy.Segregated_Cost;
            chy._is_Segregation = true;
            combGoods.Enabled = true;
        }

        if (radSegregatedQuantity.Checked)
        {
            chy._chartBy = ISCMS.Main.PlantSegregation.ChartBy.Segregated_Quantity;
            chy._is_Segregation = true;
            combGoods.Enabled = true;
        }

        if (radCumulativeCost.Checked)
        {
            chy._chartBy = ISCMS.Main.PlantSegregation.ChartBy.Cumulative_Cost;
            chy._is_Segregation = false;
            combGoods.Enabled = false;
        }

        if (radCumulativeQuantity.Checked)
        {
            chy._chartBy = ISCMS.Main.PlantSegregation.ChartBy.Cumulative_Quantity;
            chy._is_Segregation = false;
            combGoods.Enabled = false;
        }

        if (radChangeRate.Checked)
        {
            chy._chartBy = ISCMS.Main.PlantSegregation.ChartBy.Rate;
            chy._is_Segregation = false;
            combGoods.Enabled = true;
        }

        string chartByFilter = "";
        string goodsFilter = "";

        chy.InitializeFilter(out chartByFilter, out goodsFilter);

        if (!IsPostBack || IsAllowed)
        {
            combReports.DataSource = 
              ((nodeDataset)Application["nodeDS"]).Nodes.Select(chartByFilter);
            combReports.DataTextField = "SelectedNode";
            combReports.DataValueField = "Execute";
            combReports.DataBind();

            System.Data.DataRow[] rows = ((System.Data.DataSet)
              Application["Parameters"]).Tables["Goods"].Select(goodsFilter);

            ListItem li = new ListItem();
            for (int i = 0; i < rows.Length; i++)
            {
                li = new ListItem();
                li.Text = rows[i]["Name"].ToString();
                li.Value = rows[i]["Goods_ID"].ToString();
                combGoods.Items.Add(li);
            }
        }
        
        UpdateChart();
    }

    void UpdateChart()
    {
        chy._goods_ID = Convert.ToInt32(combGoods.SelectedValue);
        chy._goods_Name = combGoods.SelectedItem.Text;
        chy._chartName = combReports.SelectedValue.ToString();
        chy._charts = ISCMS.Main.PlantSegregation.Charts.Bar;
        combMonth.Enabled = false;

        if (combPeriod.Text == "Monthly")
            combMonth.Enabled = true;

        chy.UpdateChartPeriod(combPeriod.Text, combMonth.Text, 
                              combMonth.SelectedValue, combYear.Text);
    }

    protected void radProcurement_CheckedChanged(object sender, EventArgs e)
    {
        IsAllowed = true;
        SetRadio();
    }

    protected void combReports_SelectedIndexChanged(object sender, EventArgs e)
    {
        IsAllowed = false;
        SetRadio();
    }
</script>

初始化 ISCMS.Main.Chart 对象后,图表就可以渲染了,因为 ISCMS.Main.Chart 本身是一个用于生成图表对象的辅助类,也是其属性的存储库。通过调用 GetChart() 方法,将返回 System.Web.UI.DataVisualization.Charting.Chart 对象,该对象已准备好进行渲染,因为所有图表生成步骤都在 GetChart() 方法中执行。

<table style="width: 980px" >
     <tr>
     <td >
     <%
        System.Web.UI.DataVisualization.Charting.Chart Chart1 = 
                  new System.Web.UI.DataVisualization.Charting.Chart();
        
        // Initialize chart
        Chart1 = chy.GetChart();
        
        // Render chart control
        Chart1.Page = this;
        HtmlTextWriter writer = new HtmlTextWriter(Page.Response.Output);
        Chart1.RenderControl(writer);
     %>
     </td>
     </tr>
</table>

内部工作

Chart 类

Chart 控件为图表报告提供了一个画布。它充当 chartArea 的容器。因此,它可以被视为图表将被掩盖的框架。SetChart() 方法在解决方案中使用来设置图表的属性。它分配标题并为报告设置图例属性。

System.Web.UI.DataVisualization.Charting.Chart SetChart()
{
    System.Web.UI.DataVisualization.Charting.Chart chartTemp = 
                    new System.Web.UI.DataVisualization.Charting.Chart();
    chartTemp.BackColor = System.Drawing.Color.Gainsboro;
    chartTemp.BackGradientStyle = 
           System.Web.UI.DataVisualization.Charting.GradientStyle.TopBottom;
    chartTemp.BackSecondaryColor = System.Drawing.Color.Silver;
    chartTemp.BorderlineColor = System.Drawing.Color.Silver;
    // System.Drawing.Color.FromArgb(((int)(((byte)(26)))),
    //      ((int)(((byte)(59)))), ((int)(((byte)(105)))));

    chartTemp.BorderlineDashStyle = 
       System.Web.UI.DataVisualization.Charting.ChartDashStyle.Solid;
    chartTemp.BorderlineWidth = 3;
    chartTemp.BorderSkin.SkinStyle = 
       System.Web.UI.DataVisualization.Charting.BorderSkinStyle.None;
   

    if (_charts == ISCMS.Main.PlantSegregation.Charts.Pie)
    {
        chartTemp.ChartAreas.Add(SetPieChartArea());
    }
    else
    {
        chartTemp.ChartAreas.Add(SetChartArea());
    }

    chartTemp.Legends.Add(SetLegend());
    //chartTemp.Location = new System.Drawing.Point(10, 10);
    //chartTemp.Name = "chart";
    //chartTemp.Size = new System.Drawing.Size(1000, 450);
    chartTemp.TabIndex = 0;

    return chartTemp;
}

ChartArea 类

ChartArea 是 Chart 类的内容。它作为集合添加到 Chart 类中。它提供了图表报告的内在可视化,除了数据可视化。数据可视化由 Series 完成,稍后将进行讨论。SetChartArea() 方法设置了图表区域的属性,这些属性定义了要生成的报告的样式、x 轴和 y 轴。

ChartArea SetChartArea()
{
    System.Web.UI.DataVisualization.Charting.ChartArea chartArea1 = 
              new  System.Web.UI.DataVisualization.Charting.ChartArea();

    chartArea1.Area3DStyle.Inclination = 15;
    chartArea1.Area3DStyle.IsClustered = true;
    chartArea1.Area3DStyle.IsRightAngleAxes = false;
    chartArea1.Area3DStyle.LightStyle = 
       System.Web.UI.DataVisualization.Charting.LightStyle.Realistic;
    chartArea1.Area3DStyle.Perspective = 7;
    chartArea1.Area3DStyle.Rotation = 20;
    chartArea1.Area3DStyle.WallWidth = 10;
    chartArea1.AxisX.LabelStyle.Font = new System.Drawing.Font(
         "Trebuchet MS", 8.25F, System.Drawing.FontStyle.Bold);
    chartArea1.AxisX.LineColor = System.Drawing.Color.Teal;
    chartArea1.AxisX.MajorGrid.LineColor = System.Drawing.Color.Teal;
    chartArea1.AxisY.LabelStyle.Font = new System.Drawing.Font(
         "Trebuchet MS", 8.25F, System.Drawing.FontStyle.Bold);
    chartArea1.AxisY.LineColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))), 
            ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
    chartArea1.AxisY.MajorGrid.LineColor = System.Drawing.Color.Teal;
    chartArea1.BackColor = System.Drawing.Color.Gainsboro;
    chartArea1.BackGradientStyle = 
       System.Web.UI.DataVisualization.Charting.GradientStyle.TopBottom;
    chartArea1.BackSecondaryColor = System.Drawing.Color.Silver;
    chartArea1.BorderColor = System.Drawing.Color.Teal;
    chartArea1.BorderDashStyle = 
       System.Web.UI.DataVisualization.Charting.ChartDashStyle.Solid;
    chartArea1.Name = "Default";
    chartArea1.ShadowColor = System.Drawing.Color.Transparent;

    return chartArea1;
}

Series 类

Series 类位于 System.Web.UI.DataVisualization.Charting 命名空间中。Series 类对象是 ChartArea 类的内容。它们作为集合添加到 ChartArea 对象中。因此,我们可以在同一个 chartArea 中拥有多种类型的图表,用于比较报告。Series 类对象是 DataPoint 对象的集合。可以通过 series.Points.AddXY(ts.Days, amount) 方法收集 DataPointaddXY( , ) 方法的第一个参数定义了点的 x 坐标,y 坐标从第二个参数收集。当 series 类型设置为 SeriesChartType.Line 时,DataPoint 将充当连接集合中所有 DataPoint 的点,从而生成一条线。如果设置为 SeriesChartType.Column,则 y 坐标将是垂直条的高度,其在底座上的位置由 x 坐标决定。Kage 图也是如此。

帕累托图

帕累托图是一种组合图。它是柱状图和折线图的组合。柱状图显示 x 轴上的产品或材料,y 轴上的数量或金额。在同一图表中,折线图显示前一材料的累积总和。InitializeParetoChart()ParetoChartTypeLoad() 是生成此图表的基本方法。

private void InitializeParetoChart()
{
    // Initialize chart control
    this.chart = SetChart();

    
    // setting attributes associated with pareto chart
    this.chart.ChartAreas[0].AxisX.Interval = 1;
    this.chart.ChartAreas[0].AxisX.IntervalType = 
       System.Web.UI.DataVisualization.Charting.DateTimeIntervalType.Days;
    this.chart.ChartAreas[0].AxisX.IntervalOffset = 1;
    this.chart.ChartAreas[0].AxisX.IntervalOffsetType = 
       System.Web.UI.DataVisualization.Charting.DateTimeIntervalType.Days;
    this.chart.ChartAreas[0].AxisX.LabelAutoFitStyle |= 
       System.Web.UI.DataVisualization.Charting.LabelAutoFitStyles.LabelsAngleStep90;
    this.chart.ChartAreas[0].AxisY2.IsLabelAutoFit = false;

    // populating the chart
    ParetoChartTypeLoad();
    
}

void MakeParetoChart(System.Web.UI.DataVisualization.Charting.Chart chart, 
                     string srcSeriesName, string destSeriesName)
{
    // get name of the ChartAre of the source series
    string strChartArea = chart.Series[srcSeriesName].ChartArea;

    // ensure the source series is a column chart type
    chart.Series[srcSeriesName].ChartType = 
      System.Web.UI.DataVisualization.Charting.SeriesChartType.Column;

    // sort the data in the series to be by values in descending order
    chart.DataManipulator.Sort(
      System.Web.UI.DataVisualization.Charting.PointSortOrder.Descending, 
      srcSeriesName);

    // find the total of all points in the source series
    double total = 0.0;
    foreach (System.Web.UI.DataVisualization.Charting.DataPoint pt 
             in chart.Series[srcSeriesName].Points)
        total += pt.YValues[0];

    // set the max value on the primary axis to total
    chart.ChartAreas[strChartArea].AxisY.Maximum = total;

    // create the destination series and add it to the chart
    System.Web.UI.DataVisualization.Charting.Series destSeries = 
       new System.Web.UI.DataVisualization.Charting.Series(destSeriesName);
    chart.Series.Add(destSeries);

    // ensure the destination series is a Line or Spline chart type
    destSeries.ChartType = 
      System.Web.UI.DataVisualization.Charting.SeriesChartType.Line;
    destSeries.BorderWidth = 3;

    // assign the series to the same chart area as the column chart
    destSeries.ChartArea = chart.Series[srcSeriesName].ChartArea;

    // assign this series to use the secondary axis and set it maximum to be 100%
    destSeries.YAxisType = 
      System.Web.UI.DataVisualization.Charting.AxisType.Secondary;
    chart.ChartAreas[strChartArea].AxisY2.Maximum = 100;

    // locale specific percentage format with no decimals
    chart.ChartAreas[strChartArea].AxisY2.LabelStyle.Format = "P00";

    // turn off the end point values of the primary X axis
    chart.ChartAreas[strChartArea].AxisX.LabelStyle.IsEndLabelVisible = false;

    // for each point in the source series find % of total and assign to series
    double percentage = 0.0;

    foreach (System.Web.UI.DataVisualization.Charting.DataPoint pt 
             in chart.Series[srcSeriesName].Points)
    {
        percentage += (pt.YValues[0] / total * 100.0);
        destSeries.Points.Add((Math.Round(percentage, 2)));
    }
}

private void ParetoChartTypeLoad()
{
    // Accessiing datasource
    ISCMS.Main.PlantSegregation pseg =
       new ISCMS.Main.PlantSegregation
       (_plantSegment, _charts, _chartBy, _is_Segregation, this);

    rows = pseg.Process();

    // Set report title
    this.chart.Titles.Add(SetTitle());

    // Initialize Series
    System.Web.UI.DataVisualization.Charting.Series series = 
        new System.Web.UI.DataVisualization.Charting.Series();
    series.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(180)))), 
       ((int)(((byte)(26)))), ((int)(((byte)(59)))), ((int)(((byte)(105)))));
    series.ChartArea = "Default";
    series.Legend = "Default";
    series.Name = "Default";

    // Add Series to a chart
    this.chart.Series.Add(series);

    chart.Series["Default"].Points.Clear();
    int amount = 0;

    // provide series with datapoints 
    for (int i = 0; i < rows.Length; i++)//
    {
        amount = pseg.ProcessItem(i);
        if (amount == 0)
            continue;
        chart.Series["Default"].Points.AddXY(
                 rows[i]["Name"].ToString(), amount);
    }

    // Make Pareto Chart
    if (chart.Series.Count > 1)
        chart.Series.RemoveAt(1);
    MakeParetoChart(chart, "Default", "Pareto");

    // Set chart types for output data
    chart.Series["Pareto"].ChartType = 
      System.Web.UI.DataVisualization.Charting.SeriesChartType.Line;

    // Set Color of line Pareto chart
    chart.Series["Pareto"].Color = Color.FromArgb(252, 180, 65);

    // set the markers for each point of the Pareto Line
    chart.Series["Pareto"].IsValueShownAsLabel = false;
    chart.Series["Pareto"].MarkerColor = Color.Red;
    chart.Series["Pareto"].MarkerStyle = 
       System.Web.UI.DataVisualization.Charting.MarkerStyle.None;
    chart.Series["Pareto"].MarkerBorderColor = Color.MidnightBlue;
    chart.Series["Pareto"].MarkerSize = 8;
    chart.Series["Pareto"].LabelFormat = "0.#";
    // format with one decimal and leading zero
}

Pareto.JPG

折线图

此图表用于表示相对于成本和数量的永久库存。生成此图表的主要方法是 InitializeLineCurvesChart()LineCurvesChartTypeLoad()

#region Line Chart
private void InitializeLineCurvesChart()
{
    // Initialize chart control
    chart = SetChart();

    // populating the chart
    chart = LineCurvesChartTypeLoad(chart);
   
}

private System.Web.UI.DataVisualization.Charting.Chart LineCurvesChartTypeLoad(
        System.Web.UI.DataVisualization.Charting.Chart chart)
{
    // Accessiing datasource
    ISCMS.Main.PlantSegregation pseg =
        new ISCMS.Main.PlantSegregation
        (_plantSegment, _charts, _chartBy, _is_Segregation, this);

    rows = pseg.Process();
               
    // Set title for Report
    chart.Titles.Add(SetTitle());

    // Initialize Series
    System.Web.UI.DataVisualization.Charting.Series series = 
        new System.Web.UI.DataVisualization.Charting.Series();
    series.BorderColor = System.Drawing.Color.Transparent;
    series.BorderWidth = 3;
    series.ChartArea = "Default";
    series.ChartType = System.Web.UI.DataVisualization.Charting.SeriesChartType.Area;
    series.Color = _serial_Color;
    series.Legend = "Default";
    series.MarkerSize = 4;
    series.MarkerStyle = System.Web.UI.DataVisualization.Charting.MarkerStyle.Circle;
    series.Name = "series";
    series.ShadowColor = System.Drawing.Color.Gainsboro;
    series.ShadowOffset = 2;
    series.XValueType = System.Web.UI.DataVisualization.Charting.ChartValueType.Date;
    series.YValueType = System.Web.UI.DataVisualization.Charting.ChartValueType.Double;
    series.BorderColor = System.Drawing.Color.Transparent;

    TimeSpan ts = DateTime.Now - new DateTime(1900, 1, 1);
    double days = ts.Days;
    double days2 = days;
    int amount = 0;
    int perviousAmount = 0;

    // providing series datapoints
    for (int pointIndex = 0; pointIndex < rows.Length; pointIndex++)
    {
        amount = pseg.ProcessItem(pointIndex);
        ts = DateTime.Parse(rows[pointIndex]["Date"].ToString()) - new DateTime(1900, 1, 1);
        if (perviousAmount == 0 && pointIndex == 0)
        {
            series.Points.AddXY(ts.Days, amount);
            perviousAmount = amount;
            continue;
        }

        if (pointIndex == (rows.Length - 1))
        {
            series.Points.AddXY(ts.Days, amount);
            continue;
        }

        if (perviousAmount != amount)
        {
            series.Points.AddXY(ts.Days, amount);
            perviousAmount = amount;
            continue;
        }
    }

    series.ChartType = System.Web.UI.DataVisualization.Charting.SeriesChartType.Line;
    series.IsValueShownAsLabel = true;
    chart.ChartAreas["Default"].Area3DStyle.Enable3D = true;
   

    // Add Series to a chart
    chart.Series.Add(series);
    return chart;
}
#endregion

Line.JPG

饼图

这是一个累积图,可以通过调用 InitializePieCollection() 方法生成。其代码如下所示

private void InitializePieCollection()
{
    // Initialize chart control
    this.chart = SetChart();

    // setting attributes associated with Pie chart
    this.chart.Legends[0].Enabled = true;
    this.chart.Legends[0].IsEquallySpacedItems = true;

    // populating the chart
    PieChartTypeLoad();
}

private void PieChartTypeLoad()
{
    // Accessiing datasource
    ISCMS.Main.PlantSegregation pseg =
        new ISCMS.Main.PlantSegregation
        (_plantSegment, _charts, _chartBy, _is_Segregation, this);

    rows = pseg.Process();

    // Set report title
    this.chart.Titles.Add(SetTitle());

    // Initialize Series
    System.Web.UI.DataVisualization.Charting.Series series =
        new System.Web.UI.DataVisualization.Charting.Series();
    series.BorderColor = System.Drawing.Color.FromArgb(((int)(((byte)(64)))),
       ((int)(((byte)(64)))), ((int)(((byte)(64)))), ((int)(((byte)(64)))));
    series.ChartArea = "Area1";
    series.ChartType =
        System.Web.UI.DataVisualization.Charting.SeriesChartType.Pie;
    series.Color = System.Drawing.Color.FromArgb(((int)(((byte)(180)))),
        ((int)(((byte)(65)))), ((int)(((byte)(140)))), ((int)(((byte)(240)))));
    series.CustomProperties = "DoughnutRadius=15, PieDrawingStyle=Concave,
       CollectedLabel=Other, MinimumRelative" +
        "PieSize=10";
    series.Font = new System.Drawing.Font("Trebuchet MS", 8.25F,
        System.Drawing.FontStyle.Bold);
    series.Label = "#PERCENT{P1}";
    series.Legend = "Default";
    series.MarkerStyle =
        System.Web.UI.DataVisualization.Charting.MarkerStyle.Circle;
    series.Name = "Default";
    series.XValueType =
        System.Web.UI.DataVisualization.Charting.ChartValueType.Double;
    series.YValueType =
        System.Web.UI.DataVisualization.Charting.ChartValueType.Double;

    System.Web.UI.DataVisualization.Charting.DataPoint dataPoint1 =
        new System.Web.UI.DataVisualization.Charting.DataPoint(0, 0);
    int amount = 0;

    // providing series with datapoints 
    for (int i = 0; i < rows.Length; i++)
    {
        amount = pseg.ProcessItem(i);
        dataPoint1 = new System.Web.UI.DataVisualization.Charting.DataPoint(0,
            amount);
        dataPoint1.CustomProperties = "OriginalPointIndex=" + i.ToString();
        dataPoint1.IsValueShownAsLabel = false;
        dataPoint1.LegendText = rows[i]["Name"].ToString();

        //if (!chkPercentage.Checked)
            dataPoint1.Label = rows[i]["Name"].ToString();
        series.Points.Add(dataPoint1);
    }

    // Add Series to a chart
    this.chart.Series.Add(series);

    // Set series font
    chart.Series[0].Font = new Font("Trebuchet MS", 8, FontStyle.Bold);
    chart.Series[0]["CollectedToolTip"] = "Other";
    chart.Series["Default"]["PieLabelStyle"] = "Outside";

    chart.Series["Default"]["CollectedThreshold"] = "8";
 
    // Remove supplemental series and chart area if they already exsist
    if (chart.Series.Count > 1)
    {
        chart.Series.RemoveAt(1);
        chart.ChartAreas.RemoveAt(1);
        // Reset automatic position for the default chart area
        chart.ChartAreas["Default"].Position.Auto = true;
    }
}

Pie.JPG

条形图

这里显示了柱状图的代码

private void InitializeBarColumn()
{
    // Initialize chart control
    this.chart = SetChart();

    // populating the chart
    BarColumnChartTypeLoad();
}

private void BarColumnChartTypeLoad()
{
    // Accessiing datasource
    ISCMS.Main.PlantSegregation pseg =
        new ISCMS.Main.PlantSegregation
        (_plantSegment, _charts, _chartBy, _is_Segregation, this);

    rows = pseg.Process();

    // Set report's title
    this.chart.Titles.Add(SetTitle());

    // Initialize Series
    System.Web.UI.DataVisualization.Charting.Series series =
        new System.Web.UI.DataVisualization.Charting.Series();
    series.ChartArea = "Default";
    series.Legend = "Default";
    series.Name = "series";
    series.XValueType = 
      System.Web.UI.DataVisualization.Charting.ChartValueType.DateTime;
    series.ChartType = 
      System.Web.UI.DataVisualization.Charting.SeriesChartType.Column;
    this.chart.Series.Clear();

    // Set title for Report
    this.chart.Series.Add(series);
    TimeSpan ts = DateTime.Now - new DateTime(1900, 1, 1);
    double days = ts.Days;
    double days2 = days;
    int amount = 0;

    // providing series with datapoints 
    for (int pointIndex = 0; pointIndex < rows.Length; pointIndex++)
    {
        amount = pseg.ProcessItem(pointIndex);
        ts = DateTime.Parse(rows[pointIndex]["Date"].ToString()) - 
             new DateTime(1900, 1, 1);
        series.Points.AddXY(ts.Days, amount);
    }
    series.Color = _serial_Color;

    series.BorderColor = System.Drawing.Color.Transparent;
    chart.ChartAreas["Default"].Area3DStyle.Enable3D = true;
    
    // Setting attribute associated with chart area
    chart.ChartAreas[0].AxisX.LabelStyle.IntervalOffset = 1;
    chart.ChartAreas[0].AxisX.LabelStyle.IntervalOffsetType = 
        System.Web.UI.DataVisualization.Charting.DateTimeIntervalType.Days;
    chart.ChartAreas[0].AxisX.LabelStyle.Interval = 2;
    chart.ChartAreas[0].AxisX.LabelStyle.IntervalType =
        System.Web.UI.DataVisualization.Charting.DateTimeIntervalType.Days;
}

Bar.JPG

Kagi 图

Kagi 图用于监测一段时间内材料或成品率。可以通过以下代码建立此图表

private void InitializeKagiChart()
{
    // Initialize chart control
    this.chart = SetChart();

    // populating the chart
    KagiChartTypeLoad();
}
private void KagiChartTypeLoad()
{
    ISCMS.Main.PlantSegregation pseg =
       new ISCMS.Main.PlantSegregation
       (_plantSegment, _charts, _chartBy, _is_Segregation, this);

    rows = pseg.Process();

    DataSet ds = new DataSet();
    ds.Merge(rows);
    System.Web.UI.DataVisualization.Charting.Series series =
        new System.Web.UI.DataVisualization.Charting.Series();
    series.BorderColor = System.Drawing.Color.Teal;
    series.BorderWidth = 3;
    series.ChartArea = "Default";
    series.ChartType = 
       System.Web.UI.DataVisualization.Charting.SeriesChartType.Kagi;
    series.Color = System.Drawing.Color.Tomato;
    series.CustomProperties = "PriceUpColor=SkyBlue";
    series.IsXValueIndexed = true;
    series.Legend = "Default";
    series.Name = "Default";
    series.ShadowColor = System.Drawing.Color.Gainsboro;
    series.ShadowOffset = 2;
    series.XValueType = 
      System.Web.UI.DataVisualization.Charting.ChartValueType.Date;
    series.YValueType = 
      System.Web.UI.DataVisualization.Charting.ChartValueType.Double;
    this.chart.Titles.Add(SetTitle());

    series.Points.Clear();
    double bufRate = 0;
    TimeSpan ts;

    for (int pointIndex = 0; pointIndex < rows.Length; pointIndex++)
    {
        ts = DateTime.Parse(rows[pointIndex]["Date"].ToString()) - 
             new DateTime(1900, 1, 1);
        if (ds.Tables[0].Select(" Date = #" + 
            DateTime.Parse(
                rows[pointIndex]["Date"].ToString()).ToShortDateString() +
                "#").Length > 0)// ts.Days == 0 )
        {
            series.Points.AddXY(ts.Days, Convert.ToDouble(rows[pointIndex]["Unit_Cost"]));
            bufRate = Convert.ToDouble(rows[pointIndex]["Unit_Cost"]);
        }
        else
            series.Points.AddXY(ts.Days, bufRate);
    }
    chart.ChartAreas["Default"].Area3DStyle.Enable3D = true;
    //series["ReversalAmount"] = combReversalAmount.Text;
    this.chart.Series.Add(series);
}
© . All rights reserved.