2011-05-04 39 views
2

我正在嘗試使用Microsoft's charting library構建股票圖表。ASP.NET MVC 3 MSChart錯誤:只能爲此數據系列設置1個Y值

我使用此代碼創建在我看來圖表:

@{ 
    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

的「股票「chartType應該允許Y的4個值,並且這似乎在使用反射器檢查Chart幫助程序的代碼時得到確認。我錯過了什麼嗎?

回答

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"); 
    } 
} 

此代碼位於我的控制器中,並且沒有視圖存在,因爲它正在返回實際的圖像資源。通過使用重載系列構造

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

如果有人感到困惑,圖表似乎來自System.Web.UI.DataVisualization.Charting命名空間。而不是System.Web.Helpers命名空間 – Ben 2016-06-20 15:31:52

1

嗯,其實最簡單的辦法就是將其更改爲Series(string name, int yValues)。看下面的例子。

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

我遇到與OP相同的問題。這個答案如何解決問題? – WolfyUK 2012-06-05 14:25:18

1

我解決了這個問題:

0

有同樣的問題處理後 - 只能夠一個值添加到系列 - 而試圖建立與多個Y軸值堆積柱形圖 - 使用Web.Helper.Chart類。

我在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");