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

