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

释放DevExpress Ribbon窗体后ZedGraph无法重新显示数据的问题

问题描述

在DevExpress Ribbon窗体中使用ZedGraph库展示数据,通过ShowDialog方法调用窗体,使用后将其释放。但释放窗体后再次尝试展示数据时,数据无法显示。

附代码:

GraphPane zed1Graph;
LineItem zed1PosLineItem;
LineItem zed1ForceLineItem;
LineItem zed1RefLineItem;
LineItem zed1PPLLineItem;

public PointPairList zed1RefRPPL = new PointPairList();

public RollingPointPairList zed1PosRPPL = new RollingPointPairList(2000);

public RollingPointPairList zed1ForceRPPL = new RollingPointPairList(2000);

public PointPairList zed1RefPPL = new PointPairList();
public void zed1GraphPrepare()
{
    zed1Graph = zgc1.GraphPane;
    zed1Graph.Title.Text = "Actuator1";
    zed1Graph.Title.FontSpec.IsBold = false;
    zed1Graph.Title.FontSpec.FontColor = System.Drawing.Color.Red;
    zed1Graph.YAxis.Scale.Min = 0;
    zed1Graph.XAxis.Scale.Max = 10;
    zed1Graph.XAxis.Scale.MinorStep = 1;
    zed1Graph.XAxis.Scale.MajorStep = 1;
    zed1Graph.XAxis.MajorGrid.IsVisible = true;
    zed1Graph.YAxis.MajorGrid.IsVisible = true;
    zed1Graph.XAxis.MajorGrid.Color = System.Drawing.Color.Black;
    zed1Graph.Y2Axis.IsVisible = true;
    zed1Graph.XAxis.Title.Text = "Zaman";
    zed1Graph.YAxis.Title.Text = "Pos(mm)";
    zed1Graph.Y2Axis.Title.Text = "Kuvvet(N)";
    zed1Graph.Y2Axis.Title.FontSpec.FontColor = System.Drawing.Color.Blue;
    zed1PosLineItem = zed1Graph.AddCurve("Pos(mm)", zed1PosRPPL, System.Drawing.Color.Black, SymbolType.None);
    zed1ForceLineItem = zed1Graph.AddCurve("Kuvvet(N)", zed1ForceRPPL, System.Drawing.Color.Blue, SymbolType.None);
    zed1ForceLineItem.IsY2Axis = true;
    zed1RefLineItem = zed1Graph.AddCurve("Ref", zed1RefRPPL, System.Drawing.Color.Red, SymbolType.None);
    zed1PPLLineItem = zed1Graph.AddCurve("Ref", zed1RefPPL, System.Drawing.Color.Red, SymbolType.None);
    zed1PPLLineItem.Label.IsVisible = false;

    zgc1.ContextMenuBuilder +=
new ZedGraphControl.ContextMenuBuilderEventHandler(zgc1ContextMenuBuilder);

}
问题原因
  1. 窗体通过ShowDialog打开并释放(Dispose)后,窗体内部的ZedGraphControl(zgc1)以及绑定的GraphPane、LineItem等对象都会被销毁,相关引用变为无效状态。
  2. 类成员中定义的PointPairList、RollingPointPairList在窗体释放后,虽可能仍存在,但已和销毁的ZedGraph控件解绑,再次创建窗体时未重新绑定新的GraphPane,导致数据无法显示。
  3. zed1GraphPrepare方法仅在窗体初始化时执行一次,再次打开新窗体实例时,未重新初始化ZedGraph的配置和曲线绑定。
解决方案

方案1:每次打开新窗体时重新初始化ZedGraph相关对象

将集合对象初始化和zed1GraphPrepare调用移至窗体Load事件,确保每次创建窗体实例都重新绑定:

// 移除类成员的集合初始化,改为在Load事件中创建
GraphPane zed1Graph;
LineItem zed1PosLineItem;
LineItem zed1ForceLineItem;
LineItem zed1RefLineItem;
LineItem zed1PPLLineItem;

public PointPairList zed1RefRPPL;
public RollingPointPairList zed1PosRPPL;
public RollingPointPairList zed1ForceRPPL;
public PointPairList zed1RefPPL;

private void YourForm_Load(object sender, EventArgs e)
{
    // 每次加载窗体时重新创建数据集合
    zed1RefRPPL = new PointPairList();
    zed1PosRPPL = new RollingPointPairList(2000);
    zed1ForceRPPL = new RollingPointPairList(2000);
    zed1RefPPL = new PointPairList();
    
    // 重新初始化ZedGraph配置
    zed1GraphPrepare();
}

public void zed1GraphPrepare()
{
    zed1Graph = zgc1.GraphPane;
    // 清空原有曲线,避免重复添加
    zed1Graph.CurveList.Clear();
    
    zed1Graph.Title.Text = "Actuator1";
    zed1Graph.Title.FontSpec.IsBold = false;
    zed1Graph.Title.FontSpec.FontColor = System.Drawing.Color.Red;
    zed1Graph.YAxis.Scale.Min = 0;
    zed1Graph.XAxis.Scale.Max = 10;
    zed1Graph.XAxis.Scale.MinorStep = 1;
    zed1Graph.XAxis.Scale.MajorStep = 1;
    zed1Graph.XAxis.MajorGrid.IsVisible = true;
    zed1Graph.YAxis.MajorGrid.IsVisible = true;
    zed1Graph.XAxis.MajorGrid.Color = System.Drawing.Color.Black;
    zed1Graph.Y2Axis.IsVisible = true;
    zed1Graph.XAxis.Title.Text = "Zaman";
    zed1Graph.YAxis.Title.Text = "Pos(mm)";
    zed1Graph.Y2Axis.Title.Text = "Kuvvet(N)";
    zed1Graph.Y2Axis.Title.FontSpec.FontColor = System.Drawing.Color.Blue;
    
    // 重新添加曲线并绑定新的集合
    zed1PosLineItem = zed1Graph.AddCurve("Pos(mm)", zed1PosRPPL, System.Drawing.Color.Black, SymbolType.None);
    zed1ForceLineItem = zed1Graph.AddCurve("Kuvvet(N)", zed1ForceRPPL, System.Drawing.Color.Blue, SymbolType.None);
    zed1ForceLineItem.IsY2Axis = true;
    zed1RefLineItem = zed1Graph.AddCurve("Ref", zed1RefRPPL, System.Drawing.Color.Red, SymbolType.None);
    zed1PPLLineItem = zed1Graph.AddCurve("Ref", zed1RefPPL, System.Drawing.Color.Red, SymbolType.None);
    zed1PPLLineItem.Label.IsVisible = false;

    // 移除重复绑定的事件,避免多次加载后事件重复触发
    zgc1.ContextMenuBuilder -= zgc1ContextMenuBuilder;
    zgc1.ContextMenuBuilder += new ZedGraphControl.ContextMenuBuilderEventHandler(zgc1ContextMenuBuilder);
    
    // 刷新控件
    zgc1.AxisChange();
    zgc1.Refresh();
}

方案2:避免释放窗体,改用隐藏/显示

若无需频繁创建销毁窗体,可选择隐藏窗体而非释放,下次需要时直接显示:

// 调用窗体的地方,不要使用using,也不要手动Dispose
YourGraphForm graphForm;

private void ShowGraph_Click(object sender, EventArgs e)
{
    if (graphForm == null || graphForm.IsDisposed)
    {
        graphForm = new YourGraphForm();
        graphForm.FormClosed += (s, args) => graphForm = null; // 窗体关闭时清空引用
    }
    graphForm.ShowDialog();
}

注意事项

  • 使用方案1时,确保每次打开新窗体都重新初始化数据集合和ZedGraph配置,避免引用已销毁的控件对象。
  • 若需保留之前的数据,可在窗体关闭前将数据集合内容复制到外部存储,下次创建窗体时再加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 18:35:58