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
相关产品推荐
相关产品推荐

