Форматирование оси MS Chart Control

Я использую MS Chart Control в приложении Winforms, которое я пишу. Компонент оси X графика рассеяния, который я показываю, — это данные Int64, которые в конечном итоге представляют время в формате UTC. Я хотел бы взять эти данные Int64 и, по сути, выполнить для них DataTime.FromFileTimeUTC(theTime).ToString(), чтобы показать значащие метки оси X для конечного пользователя.

В настоящее время я создаю еще один столбец в памяти DataTable для хранения эквивалента DateTime этого Int64 следующим образом:

dataTable.Columns.Add("mytimestamp");
foreach (DataRow dr in dataTable.Rows)
{
   dr["mytimestamp"] = DateTime.FromFileTimeUTC(Convert.ToInt64(dr["theint64val"].ToString()));
}

А затем использовать столбец «mytimestamp» в качестве значения оси X. Это отлично работает, и я могу показать метки оси x как значения даты и времени.

Но я бы предпочел не создавать столбец и по существу дублировать данные другого столбца, но не видел никакого способа отформатировать метки оси x. Возможно, я пропустил это, я предположил. Я видел событие AxisViewChanged в документации и видел, как я могу установить заголовок диаграммы с этими данными, но не сами метки оси X.

Любые идеи?


person itsmatt    schedule 20.10.2009    source источник
comment
@NicoTek: я дал ответ...   -  person digEmAll    schedule 04.03.2012


Ответы (2)


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

Возможный способ сделать это — подписаться на chart.FormatNumber событие, например :

void chart1_FormatNumber(object sender, FormatNumberEventArgs e)
{
    if (e.ElementType == ChartElementType.AxisLabels &&
        e.ValueType == ChartValueType.Int64)
    {
        e.LocalizedValue = DateTime.FromFileTimeUtc((long)e.Value).ToShortDateString();
    }
}

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

this.chart1.ChartAreas[0].AxisX.LabelStyle.Format = "MyAxisXCustomFormat";

затем добавьте проверку в обработчик события:

void chart1_FormatNumber(object sender, FormatNumberEventArgs e)
{
    if (e.ElementType == ChartElementType.AxisLabels &&
        e.ValueType == ChartValueType.Int64 && 
        e.Format == "MyAxisXCustomFormat")
    {
        e.LocalizedValue = DateTime.FromFileTimeUtc((long)e.Value).ToShortDateString();
    }
}
person digEmAll    schedule 04.03.2012
comment
Спасибо, @digEmAll, помогло! - person BeemerGuy; 13.05.2016

Вы пытались

 yourSeries.XValueType = ChartValueType.Time;
person Stecya    schedule 17.02.2011