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

C# WinForm中如何通过参数动态指定Chart控件绘制图表

解决C# WinForms中动态指定Chart控件绘制曲线的问题

针对你需要根据测试步骤编号动态指定Chart控件绘制曲线的需求,以下是三种可行的实现方案:

方案一:通过控件名称查找Chart实例

利用WinForms控件集合的Controls.Find方法,根据步骤编号拼接控件名称(如Chart1、Chart2),动态获取目标Chart控件。

修改后的绘制方法代码:

public void Draw_Chart(int step_no)
{
    // 拼接目标Chart控件名称
    string chartName = $"Chart{step_no}";
    // 递归查找窗体及子容器中的Chart控件
    Chart targetChart = Controls.Find(chartName, true).FirstOrDefault() as Chart;
    
    if (targetChart == null)
    {
        throw new InvalidOperationException($"未找到名为{chartName}的Chart控件");
    }

    // 复用原绘制逻辑,将所有`chart1`替换为`targetChart`
    targetChart.Series.Clear();
    targetChart.Titles.Clear();
    targetChart.Legends.Clear();
    var newSeries_1 = new Series();
    var newSeries_2 = new Series();
    newSeries_1.ChartType = SeriesChartType.Line;
    newSeries_2.ChartType = SeriesChartType.Line;
    targetChart.Series.Add(newSeries_1);
    targetChart.Series.Add(newSeries_2);
    List_X_Axis.Clear();

    for (int w = 0 ; w <= 940; w++)
    {
        parameter_value_chartX[w] = w;
        // parameter_value_chartY1[w] = 150;
        // parameter_value_chartY1[w] = 250;
    }
        
    newSeries_1.Points.DataBindXY(parameter_value_chartX, parameter_value_chartY1);
    newSeries_2.Points.DataBindXY(parameter_value_chartX, parameter_value_chartY2);

    targetChart.BackColor = Color.Gray;
    targetChart.ChartAreas[0].AxisX.Title = ".";
    targetChart.ChartAreas[0].AxisY.Title = "mm";
    targetChart.ChartAreas[0].AxisY.TitleForeColor = Color.Cyan;
    targetChart.ChartAreas[0].AxisY.LabelStyle.ForeColor = Color.Cyan;
    targetChart.ChartAreas[0].AxisX.Minimum = 0d;
    targetChart.Series[0].Color = Color.Cyan;
    targetChart.ChartAreas[0].AxisY.Minimum = cur_scale_min;
    targetChart.ChartAreas[0].AxisY.Maximum = cur_scale_max;
    targetChart.ChartAreas[0].AxisY2.Enabled = AxisEnabled.True;
    targetChart.ChartAreas[0].AxisY2.Minimum = pos_scale_min;
    targetChart.ChartAreas[0].AxisY2.Maximum = pos_scale_max;
    targetChart.ChartAreas[0].AxisY2.Title = "% of Max. Current";
    targetChart.ChartAreas[0].AxisY2.TitleForeColor = Color.Yellow;
    targetChart.ChartAreas[0].AxisY2.LabelStyle.ForeColor = Color.Yellow;
    targetChart.ChartAreas[0].AxisY2.MajorGrid.LineColor = Color.Silver;
    targetChart.ChartAreas[0].AxisY2.MajorTickMark.LineColor = Color.Silver;
    targetChart.Series[1].YAxisType = AxisType.Secondary;
    targetChart.Series[1].Color = Color.Yellow;
}

方案二:提前将Chart控件存入集合(推荐)

在窗体初始化时,将所有Chart控件按步骤顺序存入集合,后续通过步骤编号直接索引获取,避免重复查找控件,性能更优。

  1. 窗体构造函数中初始化集合:
private List<Chart> _stepCharts;

public YourForm()
{
    InitializeComponent();
    // 按测试步骤顺序添加Chart控件,注意索引与step_no对应(step_no从1开始则索引为step_no-1)
    _stepCharts = new List<Chart> { Chart1, Chart2, Chart3, /* ... 依次添加到Chart16 */ };
}
  1. 修改绘制方法:
public void Draw_Chart(int step_no)
{
    // 校验步骤编号有效性
    if (step_no < 2 || step_no > 16 || step_no - 1 >= _stepCharts.Count)
    {
        throw new ArgumentOutOfRangeException(nameof(step_no), "无效的测试步骤编号");
    }
    
    Chart targetChart = _stepCharts[step_no - 1];

    // 后续绘制逻辑与方案一完全一致,替换`chart1`为`targetChart`即可
    // ...(省略重复代码)
}

方案三:直接传入Chart控件实例

如果调用方可以直接获取到目标Chart控件实例,可直接将实例作为参数传入方法,无需依赖编号或名称,逻辑最简洁。

修改方法定义:

public void Draw_Chart(Chart targetChart)
{
    if (targetChart == null)
    {
        throw new ArgumentNullException(nameof(targetChart), "Chart控件实例不能为空");
    }

    // 复用原绘制逻辑,替换`chart1`为`targetChart`
    // ...(省略重复代码)
}

调用示例:

// 绘制步骤1的曲线
Draw_Chart(Chart1);
// 绘制步骤2的曲线
Draw_Chart(Chart2);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 14:20:26