ASP.NET MVC 3 MSChart错误:此数据系列只能设置1个Y值

时间:2011-05-04 17:16:58

标签: asp.net-mvc-3 mschart

我正在尝试使用Microsoft's charting library建立一个股票图表。

我正在使用此代码在我的视图中创建图表:

@{
    System.Web.Helpers.Chart cht = new Chart(600, 400);

    cht.AddTitle(ViewData["Symbol"].ToString());
    cht.AddSeries(name: "Price",
                  chartType: "Stock",
                  chartArea: "Top",
                  xField: "Date",
                  xValue: Model,
                  yFields: "Open,High,Low,Close",
                  yValues: Model);

    cht.Write();                  
}

当调用获取图表的操作时,抛出以下异常:

ArgumentOutOfRangeException: Data points insertion error. Only 1 Y values can be set for this data series.
Parameter name: yFields

    System.Web.UI.DataVisualization.Charting.DataPointCollection.DataBindXY(IEnumerable xValue, String xField, IEnumerable yValue, String yFields) +1076598
    System.Web.Helpers.Chart.ApplySeries(Chart chart) +508
    System.Web.Helpers.Chart.ExecuteChartAction(Action`1 action) +174
    System.Web.Helpers.Chart.GetBytes(String format) +144
    System.Web.Helpers.Chart.Write(String format) +96

“Stock”chartType应该允许Y的4个值,并且当使用反射器检查Chart帮助程序的代码时,这似乎得到确认。我错过了什么吗?

4 个答案:

答案 0 :(得分:2)

通过自己构建图表,绕过帮助程序,我能够解决这个问题。

using (Chart chart = new Chart())
{
    chart.Width = 600;
    chart.Height = 400;
    chart.RenderType = RenderType.BinaryStreaming;
    chart.Palette = ChartColorPalette.Bright;

    chart.ChartAreas.Add("Top");
    chart.ChartAreas.Add("Bottom");

    chart.Series.Add("Price");
    chart.Series.Add("Volume");

    chart.Series["Price"].ChartArea = "Top";
    chart.Series["Volume"].ChartArea = "Bottom";

    chart.Series["Price"].ChartType = SeriesChartType.Stock;
    chart.Series["Volume"].ChartType = SeriesChartType.Column;

    for (int x = 0; x < data.Quotes.Count / 2; x++)
    {
        Quote quote = data.Quotes[x];

        chart.Series["Price"].Points.AddXY(quote.Date, quote.Open, quote.High, quote.Low, quote.Close);
        chart.Series["Volume"].Points.AddXY(quote.Date, quote.Volume);
    }

    using (MemoryStream memStream = new MemoryStream())
    {
        chart.SaveImage(memStream, ChartImageFormat.Jpeg);

        return File(memStream.ToArray(), "image/jpeg");
    }
}

此代码位于我的控制器中,并且不存在任何视图,因为它返回了实际的图像资源。

答案 1 :(得分:1)

嗯,实际上最简单的方法就是将其改为:

yFields: "Open,,High,,Low,,Close",

答案 2 :(得分:1)

我通过使用重载的Series构造函数来修复它:Series(string name, int yValues)。请参阅下面的示例。

Series ohlc = new Series("Ohlc", 4);
...
ohlc.Points.AddXY(xValue, open, high, low, close);

答案 3 :(得分:0)

在处理相同的问题后 - 只能为一个系列添加一个值 - 同时尝试使用Web.Helper.Chart类构建具有多个Y轴值的Stacked Column图表。

我在MSDN或任何其他论坛(包括StackOverflow)上找不到任何一个答案。事实证明 - 它非常简单:您可以使用.AddSeries方法添加多个系列。

换句话说,用简单的英语,为要添加到图表的每个系列调用一次.AddSeries方法。

此示例用于报告每日库存量,以吨为单位,与钢铁厂相同 - 以库存中的吨钢量计算产量。

        new Chart(1000, 500, ChartTheme.Blue)
            .AddTitle("Inventory")

            .AddSeries(name: "A",
                    chartType: "StackedColumn",
                    xValue: intDays,
                    yValues: dblTons_A)

            .AddSeries(name: "B",
                    chartType: "StackedColumn",
                    xValue: intDays,
                    yValues: dblTons_B)

            .AddSeries(name: "C",
                    chartType: "StackedColumn",
                    xValue: intDays,
                    yValues: dblTons_C)

            .AddSeries(name: "D",
                    chartType: "StackedColumn",
                    xValue: intDays,
                    yValues: dblTons_D)

            .Write("png");