You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Visual Studio中C# WinForms Chart日期显示异常问题排查

WinForms Chart控件日期显示异常解决方案

问题1:INTEGER类型日期显示整数无法格式化

原因

Chart控件默认将INTEGER类型数据识别为数值,不会自动转换为日期类型,因此无法按日期格式展示。

解决方法

将整数类型的日期转换为DateTime类型,同时设置Chart的X轴为日期类型并指定显示格式。

修改后的C#代码

private void BtProdBlocos_Click(object sender, EventArgs e)
{
    try
    {
        string sql = "SELECT pd_data, pd_qtd_produzida FROM producao";
        SqliteParameter[] emptyparameter = new SqliteParameter[]{};
        DataTable dt = Funcoes.Cursor(sql, emptyparameter) as DataTable;
        
        // 添加DateTime格式的列
        dt.Columns.Add("DataFormatada", typeof(DateTime));
        foreach(DataRow row in dt.Rows)
        {
            // 根据实际存储的整数类型转换:
            // 1. 若为DateTime.Ticks
            long ticks = Convert.ToInt64(row["pd_data"]);
            row["DataFormatada"] = new DateTime(ticks);
            
            // 2. 若为Unix时间戳(秒级),替换为以下代码:
            // long unixTime = Convert.ToInt64(row["pd_data"]);
            // row["DataFormatada"] = DateTimeOffset.FromUnixTimeSeconds(unixTime).DateTime;
        }

        chart1.DataSource = dt;
        chart1.Series["Producao"].XValueMember = "DataFormatada";
        chart1.Series["Producao"].YValueMembers = "pd_qtd_produzida";
        
        // 设置X轴为日期类型,指定显示格式
        chart1.ChartAreas[0].AxisX.ValueType = ChartValueType.DateTime;
        chart1.ChartAreas[0].AxisX.LabelStyle.Format = "dd/MM/yyyy";
        
        chart1.DataBind();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

问题2:TEXT类型日期仅显示单个日期

原因

Chart将字符串类型的日期识别为分类数据,若系统默认日期格式与存储的dd/mm/yyyy格式不匹配,会导致日期解析歧义,最终无法识别不同的日期条目。

解决方法

将字符串日期转换为DateTime类型,让Chart按时间序列处理数据,而非分类数据。

修改后的C#代码

using System.Globalization; // 需要添加此命名空间

private void BtProdBlocos_Click(object sender, EventArgs e)
{
    try
    {
        string sql = "SELECT pd_data, pd_qtd_produzida FROM producao";
        SqliteParameter[] emptyparameter = new SqliteParameter[]{};
        DataTable dt = Funcoes.Cursor(sql, emptyparameter) as DataTable;
        
        // 添加DateTime格式的列,解析字符串日期
        dt.Columns.Add("DataFormatada", typeof(DateTime));
        foreach(DataRow row in dt.Rows)
        {
            string dateStr = row["pd_data"].ToString();
            // 严格按存储的dd/MM/yyyy格式解析(MM代表月份,mm代表分钟)
            row["DataFormatada"] = DateTime.ParseExact(dateStr, "dd/MM/yyyy", CultureInfo.InvariantCulture);
        }

        chart1.DataSource = dt;
        chart1.Series["Producao"].XValueMember = "DataFormatada";
        chart1.Series["Producao"].YValueMembers = "pd_qtd_produzida";
        
        // 设置X轴为日期类型,指定显示格式
        chart1.ChartAreas[0].AxisX.ValueType = ChartValueType.DateTime;
        chart1.ChartAreas[0].AxisX.LabelStyle.Format = "dd/MM/yyyy";
        
        chart1.DataBind();
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
}

可选方案:SQL查询阶段转换日期

也可以在SQL查询时直接将日期转换为标准格式,减少C#端的处理:

针对INTEGER类型(Unix时间戳)

SELECT datetime(pd_data, 'unixepoch') as pd_data_formatted, pd_qtd_produzida FROM producao

针对TEXT类型(dd/mm/yyyy)

SELECT strftime('%Y-%m-%d', pd_data, '%d/%m/%Y') as pd_data_formatted, pd_qtd_produzida FROM producao

之后在C#代码中绑定pd_data_formatted列,再转换为DateTime即可。

内容的提问来源于stack exchange,提问作者Vini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 13:17:05