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

如何在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轴属性,同时优化原代码的性能问题:

关键配置说明

  1. 禁用自动缩放:强制Chart使用手动设置的Y轴范围,避免自动调整
  2. 固定范围:设置Y轴最小值为2000,最大值为3000
  3. 设置步长:将间隔设为1,确保每个整数刻度都显示
  4. 关闭自动步长计算:避免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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 23:34:56