C# ZedGraph实时更新多曲线

本人最近在使用zedgraph绘制曲线图,具体情况如下:通过串口通讯,接收数据,然后根据协议对接收的数据解包,把需要绘制成曲线的数据填充到曲线上;
目前已把需要填充的数据复制,但是不知道怎么由点绘成曲线(运行后没有曲线,不知道怎么修改)想请教一下大家
下面是我的解包与曲线的显示的主要代码:(协议中表示,根据帧头帧尾确定一帧数据的大小,其中帧数据会显示曲线的个数:例如:接收3个实际需要填充为曲线的数据,就是绘制3个曲线)


```c#
//全局变量中的初始化
RollingPointPairList[] point = new RollingPointPairList[12];
GraphPane myPane;
string[] curveTitles = {"CH1","CH2","CH3","CH4","CH5","CH6","CH7","CH8","CH9","CH10","CH11","CH12"};
Color[] colors = {Color.Red,Color.Green,Color.Yellow,Color.Pink,Color.Red,Color.Red,Color.Red,Color.Red,Color.Red,Color.Red,Color.Red,Color.Red};
ZedGraph.SymbolType[] symbox = {SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None,SymbolType.None};
double X_Value;
//初始化图形
private void InitPlot()
{
    myPane = zgc.GraphPane;
    for(int k = 0;k < myPane.YAxisList.Count;k++)
    {
        YAxis y_axis = myPane.YAxisList[k];
        y_axis.Title.Text = curveTitles[k];
        y_axis.Color = colors[k];
    }
    myPane.CurveList[0] = myPane.AddCurve("CH1",point[0],colors[0],symbox[0]);
    myPane.CurveList[1] = myPane.AddCurve("CH2",point[1],colors[1],symbox[1]);
    myPane.CurveList[2] = myPane.AddCurve("CH3",point[2],colors[2],symbox[2]);
    myPane.CurveList[3] = myPane.AddCurve("CH4",point[3],colors[3],symbox[3]);
    myPane.CurveList[4] = myPane.AddCurve("CH5",point[4],colors[4],symbox[4]);
    myPane.CurveList[5] = myPane.AddCurve("CH6",point[5],colors[5],symbox[5]);
    myPane.CurveList[6] = myPane.AddCurve("CH7",point[6],colors[6],symbox[6]);
    myPane.CurveList[7] = myPane.AddCurve("CH8",point[7],colors[7],symbox[7]);
    myPane.CurveList[8] = myPane.AddCurve("CH9",point[8],colors[8],symbox[8]);
    myPane.CurveList[9] = myPane.AddCurve("CH10",point[9],colors[9],symbox[9]);
    myPane.CurveList[10] = myPane.AddCurve("CH11",point[10],colors[10],symbox[10]);
    myPane.CurveList[11] = myPane.AddCurve("CH12",point[11],colors[11],symbox[11]);
}
//解包执行代码,填充数据到图形
public void DisPlay(float[] PData)
{//PData里面是接收的一帧数据中需要显示到曲线上的数据,PData的长度决定曲线的个数
    
    float[] Y_Value = new float[12];
    for(int x = 0;x < pData.lenght;x++)
    {
        X_Value = (double)x; //X_Value是全局变量,X轴数据
        Y_Value[x] = PData[x];//Y轴值
        point[x] = new RollingPointPairList[100];
        point[x].Add(X_Value,Y_Value[x]);
    }
    if(point[x].Count > 100)
    {
        point[x].RemoveAt(0);
    }
    zgc.AxisChange();
    zgc.Invalidate();
    zgc.Refresh();
}

```

麻烦采纳一下哈,谢谢啦

根据您提供的代码,问题可能出在 DisPlay 函数中。在这个函数中,您创建了 RollingPointPairList 数组 point 并为每个曲线创建了一个 RollingPointPairList,但是您没有将这些点添加到曲线中。因此,在调用 zgc.AxisChange() 和 zgc.Invalidate() 后,界面上并没有显示曲线。

要将点添加到曲线中,可以使用 AddPoint 方法。例如,如果要将 point[0] 中的点添加到第一个曲线中,可以使用以下代码:

myPane.CurveList[0].Points.AddPoint(point[0].First().X, point[0].First().Y);
这个代码将 point[0] 中的第一个点添加到第一个曲线中。需要注意的是,如果 point[0] 中有多个点,您需要使用循环将它们全部添加到曲线中。

修改后的 DisPlay 函数如下所示:

c
Copy
public void DisPlay(float[] PData)
{
    // PData里面是接收的一帧数据中需要显示到曲线上的数据,PData的长度决定曲线的个数
    for (int x = 0; x < PData.Length; x++)
    {
        X_Value = x; // X_Value是全局变量,X轴数据
        float Y_Value = PData[x]; // Y轴值
        point[x].Add(X_Value, Y_Value);
        if (point[x].Count > 100)
        {
            point[x].RemoveAt(0);
        }
        myPane.CurveList[x].Points.Clear();
        myPane.CurveList[x].Points.AddRange(point[x]);
    }
    zgc.AxisChange();
    zgc.Invalidate();
    zgc.Refresh();
}
在

这个代码中,我们首先使用 Add 方法将新的点添加到 point 中。然后,我们检查 point 中的点的数量是否超过了设定的最大值,如果超过了,就使用 RemoveAt 方法删除最早的点。接下来,我们使用 Clear 方法清空第 x 个曲线中的所有点,并使用 AddRange 方法将 point[x] 中的所有点添加到曲线中。最后,我们调用 zgc.AxisChange()、zgc.Invalidate() 和 zgc.Refresh() 方法更新图形界面。

需要注意的是,这个代码假定曲线的数量与数据中需要绘制为曲线的数据数量相同,并且曲线的颜色、符号、标题等已经在 InitPlot 函数中设置好了。如果曲线数量不同,需要根据实际情况修改代码。