MS Chart Control: рисование и маркировка серии линий по всей области диаграммы - PullRequest
3 голосов
/ 16 июля 2011

У меня есть вопросы об элементе управления диаграммой MS ASP.NET.

  1. Как можно установить серию линий над серией баров, чтобы она распространялась на ось Y диаграммы?
  2. Можно ли поместить название ряда линий, т.е. "Цель", справа от диаграммы в качестве замены для включения этой серии в легенду?

Как вы можете видеть на скриншоте ниже, у меня есть ряд линий, представленный поверх ряда столбцов, который не распространяется на ось Y графика.

enter image description here

Код выглядит следующим образом:

var data1 = new Dictionary<string, float>
{
    { "W1", 80},
    { "W2", 60},
    { "W3", 40},
    { "W4", 20},
    { "W5", 10}
};
var data2 = new Dictionary<string, float>
{
    { "W1", 10},
    { "W2", 10},
    { "W3", 0},
    { "W4", 10},
    { "W5", 10}
};
var data3 = new Dictionary<string, float>
{
    { "W1", 10},
    { "W2", 30},
    { "W3", 50},
    { "W4", 70},
    { "W5", 80}
};
var data4 = new Dictionary<string, float>
{
    { "W1", 50},
    { "W2", 50},
    { "W3", 50},
    { "W4", 50},
    { "W5", 50}
};

var chart = new Chart();
chart.Height = Unit.Pixel(300);
chart.Width = Unit.Pixel(450);
chart.Legends.Add("Legend").Alignment = StringAlignment.Center;
chart.Palette = ChartColorPalette.None;
chart.PaletteCustomColors = new Color[] { Color.FromArgb(191, 214, 151), Color.FromArgb(249, 255, 149), Color.FromArgb(191, 79, 75), Color.Green };

var area = new ChartArea();
area.AxisX.MajorGrid.LineColor = Color.Transparent;
chart.ChartAreas.Add(area);

var series1 = new Series("Done");
foreach (var item in data1)
{
    series1.Points.AddXY(item.Key, item.Value);
}
series1.MarkerBorderWidth = 1;

var series2 = new Series("In Progress");
foreach (var item in data2)
{
    series2.Points.AddXY(item.Key, item.Value);
}

var series3 = new Series("Needs Review");
foreach (var item in data3)
{
    series3.Points.AddXY(item.Key, item.Value);
}

var series4 = new Series("Goal");
foreach (var item in data4)
{
    series4.Points.AddXY(item.Key, item.Value);
}
series4.ChartType = SeriesChartType.Line;
series4.BorderWidth = 2;

series1.ChartType = series2.ChartType = series3.ChartType = SeriesChartType.StackedColumn;
series1.Font = series2.Font = series3.Font = series4.Font = new Font("Verdana", 8.25f, FontStyle.Regular);

chart.Series.Add(series1);
chart.Series.Add(series2);
chart.Series.Add(series3);
chart.Series.Add(series4);

Спасибо за помощь.


ОБНОВЛЕНИЕ:
Продолжая искать подходящее решение, я реализовал дополнительную диаграмму только для ряда линий «Цель» с намерениями:

  • Установка цвета определенных свойств этого нового графика на Прозрачный и
  • Размещение этого графика поверх существующего графика

Этот подход обеспечил правильное представление, отображая ряд линий «Гол» над серией стержней и позволяя серии линий «Гол» расширяться до оси Y. Но он отключил всплывающие подсказки и действия щелчка ряда столбцов на существующем графике. Из-за этого недостаточного пользовательского опыта этот подход не является подходящим решением.

Поиск решения продолжается ...

1 Ответ

0 голосов
/ 03 августа 2011

Для вопроса 1:

Другой способ - использовать событие PostPaint, где вы можете рисовать все, что пожелаете, в любом месте графика ... но все равно вы теряете подсказки и такие интерактивные функции с этой линией.

По вашему вопросу 2:

Вы можете исключить нежелательную запись легенды из коллекции элементов легенды;вы можете настроить легенду так, как это сделано в следующем примере:

yourChart.CustomizeLegend += new EventHandler<CustomizeLegendEventArgs> (CustomizeLegendEventHandler);
//...
static void CustomizeLegendEventHandler(object sender, CustomizeLegendEventArgs e)
{
  int anotherIndex = 3;
  if (sender != null && sender is Chart)
  {
    if (e != null && e.LegendItems != null && e.LegendItems.Count > 0)
    {
      Chart ch = ((Chart)sender);
      if (...) //your logic here
      {
        //example: you can move a legend item from one index to another here:
        LegendItem item = e.LegendItems[0];
        e.LegendItems.RemoveAt(0);
        e.LegendItems.Insert(anotherIndex, item);
      }
    }
  }
}

И у вас может быть вторичная ось Y с одной меткой, одной точкой и т. д. или: вы можете использовать обработчик событий PostPaint для рисованиявсе, что вы пожелаете.

Вы можете скачать отличный устанавливаемый образец пакета с MS: здесь .Они показывают много примеров кода, которые вы можете изучить.Я узнал эти вещи из этих образцов и от использования этого нового бесплатного отражателя: ILSpy .

Надеюсь, это поможет.

...