MSChart: как сгруппировать данные RangeBar с текстовыми метками вместо индексов?

Я хочу отобразить данные в области диаграммы RangeBar (System.Windows.Forms.DataVisualization.Charting), и у меня возникают проблемы с группировкой данных, когда у меня есть текстовые значения для меток на вертикальной оси.

Вот соответствующий код:

var connectedTimeRangeSeries = theChart.Series.Add("ConnectedTimeRangeSeries");
var connectedTimeRangesChartArea = theChart.ChartAreas["PerItemConnectedChartArea"];

connectedTimeRangeSeries.ChartArea = connectedTimeRangesChartArea.Name;
connectedTimeRangeSeries.ChartType = SeriesChartType.RangeBar;
connectedTimeRangeSeries.XValueType = ChartValueType.Auto;
connectedTimeRangeSeries.YValueType = ChartValueType.Auto;

for (int i = 0; i < timeRanges.Count; i++)
{
    string theLabel = timeRanges[i].ItemLabel;

    connectedTimeRangeSeries.Points.AddXY(timeRanges[i].ItemId + 1, timeRanges[i].StartConnectionTime, timeRanges[i].StopConnectionTime);
}

timeRanges — это список с элементами, имеющими следующие типы элементов (доступ к которым осуществляется через общедоступные свойства с соответствующими именами, написанными с заглавной буквы):

private int itemId;
private string itemLabel;
private DateTime startConnectionTime;
private DateTime stopConnectionTime;

Когда я вызываю DataSeries.Points.AddXY() с типом X как целым числом (напомним, что X — это вертикальная ось на полосе диапазона), он делает то, что я хочу. Временные диапазоны сгруппированы по индексу на нижнем графике:

хорошая диаграмма

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

connectedTimeRangeSeries.Points.AddXY(theLabel, timeRanges[i].StartConnectionTime, timeRanges[i].StopConnectionTime);

данные больше не группируются:

введите здесь описание изображения

Как будто каждый получает свою корзину, и я просто хочу, чтобы они были объединены по лейблу. (Каждый индекс имеет одну и только одну метку.)

Любые идеи? Спасибо!


person John    schedule 22.06.2011    source источник
comment
Как вы это делаете connectTimeRangeSeries.Points.AddXY(theLabel, timeRanges[i].StartConnectionTime, timeRanges[i].StopConnectionTime); с 2 значениями, для меня это говорит, что у меня может быть только 1 значение.   -  person Georgiana M    schedule 10.11.2016


Ответы (1)


Используйте свойство AxisLabel объекта DataPoint. Один из способов сделать это будет примерно так:

for (int i = 0; i < timeRanges.Count; i++)
{
    string theLabel = timeRanges[i].ItemLabel;
    int pointIndex = connectedTimeRangeSeries.Points.AddXY(timeRanges[i].ItemId + 1,   timeRanges[i].StartConnectionTime, timeRanges[i].StopConnectionTime);
    connectedTimeRangeSeries.Points[pointIndex].AxisLabel = theLabel;
}
person Ivar Ragnarsson    schedule 02.09.2011