Microsoft Data Visualization (диаграмма) показывает дату как 1899-30-01 - PullRequest
0 голосов
/ 28 января 2012

Хорошо, я уже решил проблему.Должно быть double [] xvaluesTmp, и присваиваются значения: xvaluesTmp [0] = DateTime.Now.ToOADate () (как double), теперь работает идеально.Forms.DataVisualization.dll).Чтобы отобразить часы, минуты и секунды, у меня есть формат:

chartArea.AxisX.LabelStyle.Format = "{HH}:{mm}:{ss}";

И это показывает правоту.Но как выглядит формат для отображения года-месяца-дня?Я пытаюсь из документации: "D", "G", "M", "d", "y".Он показывает мне дату, но всегда показывает 1899-30-01 или 30 января 1899 и т. Д. Я перехожу к DataBinding DateTime.Now:

List<DateTime> xvaluesTmp = new List<DateTime>();
            xvaluesTmp.Add(DateTime.Now);
            xvaluesTmp.Add(new DateTime(2011, 3, 28));
...
this.chart.Series[0].Points.DataBindXY(xvaluesTmp, yvaluesTmp);

Что не так?

Спасибо

Ответы [ 2 ]

0 голосов
/ 06 января 2015

У меня была эта проблема в течение некоторого времени, и я, наконец, решил ее следующим образом:

Присоединение к событию настройки диаграммы:

_chart.Customize += Remove_1899_Label;

И в обработчике события Remove_1899_Label:

private void Remove_1899_Label(object sender, EventArgs e)
{
    Chart msChart = sender as Chart;

    foreach (var chartArea in msChart.ChartAreas)
    {
        foreach (var label in chartArea.AxisX.CustomLabels)
        {
            if (!string.IsNullOrEmpty(label.Text) && label.Text == "1899")
            {
                label.SetFieldValue("customLabel", true);
                label.Text = string.Empty;
            }
        }
    }
}

NB. По какой-то причине изменение текста метки не будет работать, если вы не установите для переменной-члена private bool с именем 'customLabel' метки значение true.Реализация метода расширения 'SetFieldValue (string, object)' я получил отсюда: http://dotnetfollower.com/wordpress/2013/06/c-how-to-set-or-get-value-of-a-private-or-internal-field-through-the-reflection/

Однако для полноты я включил его ниже.

public static class ReflectionHelper
{
        //...
        // here are methods described in the post
        // http://dotnetfollower.com/wordpress/2012/12/c-how-to-set-or-get-value-of-a-private-or-internal-property-through-the-reflection/
        //...

        private static FieldInfo GetFieldInfo(Type type, string fieldName)
        {
                FieldInfo fieldInfo;
                do
                {
                        fieldInfo = type.GetField(fieldName,
                                     BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
                        type = type.BaseType;
                }
                while (fieldInfo == null && type != null);
                return fieldInfo;
        }

        public static object GetFieldValue(this object obj, string fieldName)
        {
                if (obj == null)
                        throw new ArgumentNullException("obj");
                Type objType = obj.GetType();
                FieldInfo fieldInfo = GetFieldInfo(objType, fieldName);
                if (fieldInfo == null)
                        throw new ArgumentOutOfRangeException("fieldName",
                            string.Format("Couldn't find field {0} in type {1}", fieldName, objType.FullName));
                return fieldInfo.GetValue(obj);
        }

        public static void SetFieldValue(this object obj, string fieldName, object val)
        {
                if (obj == null)
                        throw new ArgumentNullException("obj");
                Type objType = obj.GetType();
                FieldInfo fieldInfo = GetFieldInfo(objType, fieldName);
                if (fieldInfo == null)
                        throw new ArgumentOutOfRangeException("fieldName",
                            string.Format("Couldn't find field {0} in type {1}", fieldName, objType.FullName));
                fieldInfo.SetValue(obj, val);
        }
}
0 голосов
/ 13 апреля 2012

Этот вопрос немного расплывчат, но для тех, у кого проблема с отображением даты 1899 года, убедитесь, что для ChartValueType установлено значение DateTime.

Если для ChartValueType задано время, то будет отображаться дата 1899 года.

this.mainChart.ChartTypeSelected.Series[0].XValueType = ChartValueType.DateTime;

затем отформатируйте этикетку так, как вам нужно

this.mainChart.ChartTypeSelected.ChartAreas[0].AxisX.LabelStyle.Format = "mm:ss";
...