Почему столбцы диаграммы с накоплением отображаются в виде тонких линий?

Я пытаюсь создать столбчатую диаграмму с накоплением с 4 рядами. Но почему-то после заполнения серий и проверки их выравнивания вместо колонок появляются тонкие линии. Код приведен ниже.

foreach (Series s in chartEvents.Series)
    s.Points.Clear();

foreach (DataRow dr in data.Rows)
{
    string reason = "";
    double xVal = 0;
    double yVal = 0;
    double overFlow = 0;
    double existFlow = 0;

    try
    {
        reason = dr["reasonID"].ToString();
        xVal = Math.Round(Convert.ToDateTime(dr["XValue"].ToString()).ToOADate(), 6);
        yVal = Math.Round(Convert.ToDouble(dr["duration"].ToString()) / 60, 3);
        overFlow = 0;

        // assume tooltip prepared and format length here

        do
        {
            overFlow = 0;

            #region check if duration at x value will exceed 60 mins

            foreach (Series s in chartEvents.Series)
            {
                if (s.Points.Count > 0)
                {
                    foreach (DataPoint exist in s.Points)
                    {
                        // if point found, add up.
                        if (exist.XValue == xVal)
                        {
                            existFlow += exist.YValues[0];
                        }
                    }
                }
            }

            // if added up + new  > 60, set current y to 60 and calculate for overflow
            if (existFlow + yVal > 60)
            {
                overFlow += yVal - (60 - existFlow);
                yVal = 60 - (existFlow);
            }

            #endregion

            DataPoint dp = new DataPoint(xVal, yVal);
            DataPoint dpEmpty = new DataPoint(xVal, 0);
            dpEmpty.IsEmpty = true;

            #region Check series type and add to series.

            if (reason.Contains("|"))
            {
                if (reason.Split('|')[3] == "SCHEDULED DOWN")
                {
                    if (reason.Split('|')[4].Contains("SETUP"))
                    {
                        dp.ToolTip = Convert.ToDateTime(dr["dateStart"].ToString()).ToString("yyyy-MM-dd HH:mm:ss").PadRight(25) + "SETUP:  " + actionDone;
                        dp.Color = Color.Goldenrod;

                        chartEvents.Series["SETUP"].Points.Add(dp);
                        chartEvents.Series["CLEAR"].Points.Add(dpEmpty);
                        chartEvents.Series["DOWN"].Points.Add(dpEmpty);
                        chartEvents.Series["OTHERS"].Points.Add(dpEmpty);

                    }
                    else
                    {
                        dp.ToolTip = Convert.ToDateTime(dr["dateStart"].ToString()).ToString("yyyy-MM-dd HH:mm:ss").PadRight(25) + "OTHERS:  " + actionDone;
                        dp.Color = Color.Orange;

                        chartEvents.Series["OTHERS"].Points.Add(dp);
                        chartEvents.Series["CLEAR"].Points.Add(dpEmpty);
                        chartEvents.Series["DOWN"].Points.Add(dpEmpty);
                        chartEvents.Series["SETUP"].Points.Add(dpEmpty);
                    }
                }

                else if (reason.Split('|')[3] == "UNSCHEDULED DOWN")
                {
                    dp.ToolTip = Convert.ToDateTime(dr["dateStart"].ToString()).ToString("yyyy-MM-dd HH:mm:ss").PadRight(25) + "DOWN:  " + actionDone;
                    dp.Color = Color.Red;

                    chartEvents.Series["DOWN"].Points.Add(dp);
                    chartEvents.Series["CLEAR"].Points.Add(dpEmpty);
                    chartEvents.Series["OTHERS"].Points.Add(dpEmpty);
                    chartEvents.Series["SETUP"].Points.Add(dpEmpty);
                }

                else
                {
            // do something
                }
            }
            else
            {
                dp.ToolTip = actionDone;
                dp.Color = Color.Orange;

                chartEvents.Series["CLEAR"].Points.Add(dp);
                chartEvents.Series["DOWN"].Points.Add(dpEmpty);
                chartEvents.Series["OTHERS"].Points.Add(dpEmpty);
                chartEvents.Series["SETUP"].Points.Add(dpEmpty);
            }



            #endregion

            if (overFlow > 0)
            {
                yVal = overFlow;
                xVal = DateTime.FromOADate(xVal).AddHours(1).ToOADate();
                existFlow = 0;
            }

        } while (overFlow != 0);
    }
    catch (Exception ex)
    {
    // do something
    }
}

person honsho    schedule 13.06.2015    source источник


Ответы (1)


Вы, вероятно, неправильно X-Values для этой цели.

Обратите внимание, что ваши Series могут складываться только там, где DataPoints имеют одинаковые X-Value. DateTimes включают время вплоть до долей секунды, поэтому они никогда не будут суммироваться, если вы не измените их для достижения своей цели.

В вашем коде здесь не хватает места:

xVal = Math.Round(Convert.ToDateTime(dr["XValue"].ToString()).ToOADate(), 6);

Округление DateTime / OADate double до 6 цифр, к сожалению, не сократит временную часть. Для этого вы должны вместо этого просто написать XValue = someDateTimeVariable.Date;

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

Есть несколько способов сделать это, вот один из них:

// define a suitable format string:
string myIntervalMonthFormat = "yyyy-MM-01 00:00:00";
string myIntervalDayFormat = "yyyy-MM-dd 00:00:00";
string myIntervalHourFormat = "yyyy-MM-dd hh:00:00";
string myIntervalMinuteFormat = "yyyy-MM-dd hh:mm:00";
// etc

Теперь вы можете использовать его:

string so = ((DateTime) dr["XValue"]).ToString(yourFormat );
xVal = Math.Round(Convert.ToDateTime(so).ToOADate(), 6);  

Вот два результата, все те же данные, только один с минутным интервалом, а другой с сутками.:

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

Я предлагаю рассмотреть возможность установки X-Axis и X-Values для использования типа данных DateTime!

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

person TaW    schedule 13.06.2015
comment
Эй ТаВ! Спасибо! Оно работает! действительно не ожидал, что ошибка - это просто формат даты и времени... - person honsho; 15.06.2015