Ошибка ASP.NET MVC 3 MSChart: для этой серии данных можно установить только 1 значение Y

Я пытаюсь построить биржевую диаграмму, используя библиотека графиков Microsoft.

Я использую этот код для создания диаграммы в моем представлении:

@{
    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 "Stock" должен допускать 4 значения для Y, и это подтверждается при использовании рефлектора для проверки кода помощника диаграммы. Я что-то пропустил?


person Kyle Trauberman    schedule 04.05.2011    source источник


Ответы (4)


Я смог обойти эту проблему, построив диаграмму самостоятельно, минуя помощника.

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

Этот код находится в моем контроллере, и для него не существует представления, потому что он возвращает фактический ресурс изображения.

person Kyle Trauberman    schedule 05.05.2011
comment
Если кто-то запутался, диаграмма, похоже, принадлежит пространству имен System.Web.UI.DataVisualization.Charting. не пространство имен System.Web.Helpers - person Ben; 20.06.2016

Ну, на самом деле самый простой способ - просто изменить его на:

yFields: "Open,,High,,Low,,Close",
person zs2020    schedule 25.07.2011
comment
У меня та же проблема, что и у ОП. Как этот ответ решает проблему? - person wolfyuk; 05.06.2012

Я исправил это с помощью перегруженного конструктора Series: Series(string name, int yValues). См. пример ниже.

Series ohlc = new Series("Ohlc", 4);
...
ohlc.Points.AddXY(xValue, open, high, low, close);
person Chris Reay    schedule 18.02.2013

После решения той же проблемы - только возможность добавить одно значение в ряд - при попытке построить столбчатую диаграмму с накоплением с несколькими значениями оси 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");
person user1480807    schedule 15.08.2013