Microsoft数据可视化(图表)显示日期为1899-30-01

本文关键字:显示 日期 1899-30-01 图表 数据 可视化 Microsoft | 更新日期: 2023-09-27 18:21:36

好的,我已经解决了这个问题。必须是双[]xvaluesTmp,并且赋值:xvaluesTmp[0]=DateTime.Now.ToOADate()(作为双),现在可以完美


我下载了Microsoft图表控件(System.Windows.Forms.DataVisualization.dll)。要显示小时、分钟和秒,我有格式:

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

它显示了正确性。但是看起来格式如何显示年月日?我尝试文档:"D"、"G"、"M"、"D"、"y"。它显示我的日期,但总是显示1899-30-01或1899年1月30日等。我转到DataBinding DateTime。现在:

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);

怎么了?

感谢

Microsoft数据可视化(图表)显示日期为1899-30-01

我遇到这个问题已经有一段时间了,最终通过解决了它

附加到图表的自定义事件:

_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;
            }
        }
    }
}

N.B由于某些原因,除非您还将标签的名为"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);
        }
}

这个问题有点模糊,但对于任何对1899日期显示有问题的人,请确保ChartValueType设置为DateTime。

如果ChartValueType设置为Time,则会显示1899年的日期。

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

然后将标签格式化为您需要的

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