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

C# Chart控件运行时Legend图例无法正常显示问题求助

核心错误点
  • 图例创建逻辑位置错误:Legend实例化、添加到图表的代码被放在foreach循环内部,每遍历一行数据就会新增一个重复的图例对象,数据行数与新增空图例数量一致,既会挤占图表绘图区域导致图表尺寸缩小,也是抛出「指定序列已存在」错误的核心诱因。
  • 序列与图例未绑定:动态创建Series时,没有指定序列关联的目标图例,也没有设置序列在图例中显示的文本,即使图例创建成功,也没有可渲染的图例条目,无法看到图例内容。
  • 新序列分支逻辑缺失:判断设备名变化新建序列的分支中,没有给新序列添加当前遍历到的首条数据,会导致每个设备的第一条振动数据丢失。
修正后代码
// 初始化前先清空历史残留的图例、序列,避免重复添加报错
chartHorizontalDE.Legends.Clear();
chartHorizontalDE.Series.Clear();

// 整个绘图流程仅创建1次图例,放在循环外
Legend deLegend = new Legend();
deLegend.Docking = Docking.Right;
deLegend.Font = new Font("Microsoft YaHei", 9f);
chartHorizontalDE.Legends.Add(deLegend);

string lastMachineName = string.Empty;

foreach (DataGridViewRow row in dataGridView1.Rows)
{
    // 跳过DataGridView末尾的空白新行
    if (row.IsNewRow) continue;
    // 校验单元格值非空,避免空引用报错
    if (row.Cells[1].Value == null) continue;

    DateTime tempDate = Convert.ToDateTime(row.Cells[0].Value);
    if (row.Cells[1].Value.ToString().Equals(SelectedSpeed))
    {
        double yHDE = Convert.ToDouble(row.Cells[2].Value, CultureInfo.InvariantCulture);
        // 替换为实际存储设备名的列索引
        string currentMachineName = row.Cells[/*设备名列索引*/].Value.ToString();

        if (yHDE != 0)
        {
            // 检测到新设备名,先创建对应序列
            if (currentMachineName != lastMachineName)
            {
                // 二次校验序列不存在,避免重复创建同名序列报错
                if (!chartHorizontalDE.Series.Any(s => s.Name == currentMachineName))
                {
                    Series machineSeries = new Series(currentMachineName);
                    machineSeries.ChartType = SeriesChartType.Line;
                    // 关键配置:绑定序列到已创建的图例
                    machineSeries.Legend = deLegend.Name;
                    // 关键配置:设置图例项显示文本
                    machineSeries.LegendText = currentMachineName;
                    chartHorizontalDE.Series.Add(machineSeries);
                }
                lastMachineName = currentMachineName;
            }
            // 统一添加数据点,覆盖新序列、已有序列两种场景,避免首点丢失
            chartHorizontalDE.Series[currentMachineName].Points.AddXY(tempDate, yHDE);
        }
    }
}
关键配置说明
  • 图例仅初始化一次:所有图例创建、样式配置逻辑移到循环外部,绘图前清空历史冗余对象,从根源解决重复添加导致的异常和布局异常。
  • 序列必须显式关联图例:新建序列时必须给Legend属性赋值为目标图例的名称,同时设置LegendText属性,缺省这两个配置时,图例不会渲染任何条目,仅占用停靠位置压缩图表绘图区。
  • 增加重复对象校验:添加序列前先判断同名序列是否存在,即使遍历数据时遇到重复设备名,也不会触发重复创建的报错。
  • 调整分支逻辑:将数据点添加逻辑移到分支判断外部,新建序列完成后直接写入当前行数据,解决新设备首条数据丢失的问题。
  • 增加边界校验:跳过DataGridView空白新行、校验单元格值非空,避免遍历过程中触发非预期的运行时错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 13:33:22