如何在C# WinForms Chart中设置Y轴2000-3000范围及步长
使用C# WinForms Chart配置Y轴范围与步长

需求:通过WinForms的Chart组件实现上图效果,要求Y轴数值范围固定为2000到3000,步长为1(即显示2000、2001、2002……3000),数据从SQL Server动态获取。当前代码中Y轴配置未生效,需调整实现目标。
现有代码
private void LineChart() { //目前未生效,步长尚未设置 DateTime date = DateTime.Now; string Date1 = date.ToShortDateString(); Date1 = DateTime.Now.ToString("yyyy-MM-dd"); //从数据库获取统计数据。 string query = "SELECT * FROM ( Select TOP 500 SrNo,Machine,ConeWeight,Date,DateTime FROM [DB_SProd].[dbo]. [TableProduction] Where Date='"+Date1+"' order by SrNo DESC ) as Machines order by SrNo; "; DataTable dt = dbConn.GetData(query); //获取唯一的机器名称。 List<string> Machine1 = (from p in dt.AsEnumerable() select p.Field<string>("Machine")).ToList(); List<int> Weight1 = (from p in dt.AsEnumerable() select p.Field<int>("ConeWeight")).ToList(); int[] countCones = { }; //移除默认系列。 if (chart3.Series.Count() == 1) { chart3.Series.Remove(chart3.Series[0]); } //遍历机器名称。 foreach (string macine in Machine1) { //动态获取每个机器名称 string[] x = (from p in dt.AsEnumerable() where p.Field<string>("Machine") == macine orderby p.Field<string>("Machine") ascending select p.Field<string>("Machine")).ToArray(); //获取每台机器对应的锥重数据。 int[] y = (from p in dt.AsEnumerable() where p.Field<string>("Machine") == macine orderby p.Field<string>("Machine") ascending select p.Field<int>("ConeWeight")).ToArray(); countCones = new int[y.Length]; for (int i = 0; i < y.Length; i++) { countCones[i] = i; } //向图表添加系列。 if (chart3.Series.IsUniqueName(macine)) { //chart1.Series.Add(macine); chart3.Series.Add(new Series(macine)); chart3.Series[macine].IsValueShownAsLabel = false; chart3.Series[macine].BorderWidth = 2; chart3.Series[macine].ChartType = SeriesChartType.Line; chart3.Series[macine].Points.DataBindXY(countCones,y); } } chart3.Legends[0].Enabled = true; }
解决方案:配置Y轴核心参数
要实现固定范围和步长,需修改Chart的Y轴属性,同时优化原代码的性能问题:
关键配置说明
- 禁用自动缩放:强制Chart使用手动设置的Y轴范围,避免自动调整
- 固定范围:设置Y轴最小值为2000,最大值为3000
- 设置步长:将间隔设为1,确保每个整数刻度都显示
- 关闭自动步长计算:避免Chart自动调整间隔覆盖手动设置
优化后的完整代码
private void LineChart() { // 简化日期获取 string Date1 = DateTime.Now.ToString("yyyy-MM-dd"); // 使用参数化查询避免SQL注入风险(建议替换原拼接方式) string query = @"SELECT * FROM ( Select TOP 500 SrNo,Machine,ConeWeight,Date,DateTime FROM [DB_SProd].[dbo].[TableProduction] Where Date=@Date order by SrNo DESC ) as Machines order by SrNo;"; // 示例参数化调用(需根据dbConn实现调整) // DataTable dt = dbConn.GetData(query, new SqlParameter("@Date", Date1)); DataTable dt = dbConn.GetData(query); // 移除默认系列 if (chart3.Series.Count == 1) { chart3.Series.Remove(chart3.Series[0]); } // 按机器分组数据,提升查询效率 var groupedData = dt.AsEnumerable().GroupBy(p => p.Field<string>("Machine")); foreach (var group in groupedData) { string machineName = group.Key; // 生成X轴序号数据 int[] countCones = Enumerable.Range(0, group.Count()).ToArray(); // 获取当前机器的锥重数据 int[] coneWeights = group.Select(p => p.Field<int>("ConeWeight")).ToArray(); // 添加唯一系列 if (chart3.Series.IsUniqueName(machineName)) { Series series = new Series(machineName); series.IsValueShownAsLabel = false; series.BorderWidth = 2; series.ChartType = SeriesChartType.Line; series.Points.DataBindXY(countCones, coneWeights); chart3.Series.Add(series); } } // 启用图例 chart3.Legends[0].Enabled = true; // 配置Y轴核心参数 ChartArea chartArea = chart3.ChartAreas[0]; // 禁用自动缩放,强制使用手动范围 chartArea.AxisY.AutoScale = false; // 设置Y轴范围 chartArea.AxisY.Minimum = 2000; chartArea.AxisY.Maximum = 3000; // 设置步长为1 chartArea.AxisY.Interval = 1; // 关闭自动步长计算 chartArea.AxisY.IntervalAutoMode = IntervalAutoMode.FixedCount; // 可选:调整标签角度,避免密集标签重叠 chartArea.AxisY.LabelStyle.Angle = 45; }
内容的提问来源于stack exchange,提问作者Hassan Akhtar
相关产品推荐
相关产品推荐

