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

Я пытаюсь построить биржевую диаграмму, используя библиотеку графиков 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

В типе «Stock» chartType должно быть 4 значения для Y, и это подтверждается при использовании отражателя для проверки кода помощника Chart.Я что-то упустил?

Ответы [ 4 ]

2 голосов
/ 05 мая 2011

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

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 голос
/ 18 февраля 2013

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

Series ohlc = new Series("Ohlc", 4);
...
ohlc.Points.AddXY(xValue, open, high, low, close);
1 голос
/ 25 июля 2011

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

yFields: "Open,,High,,Low,,Close",
0 голосов
/ 15 августа 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");
...