释放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); }
问题原因
- 窗体通过
ShowDialog打开并释放(Dispose)后,窗体内部的ZedGraphControl(zgc1)以及绑定的GraphPane、LineItem等对象都会被销毁,相关引用变为无效状态。 - 类成员中定义的
PointPairList、RollingPointPairList在窗体释放后,虽可能仍存在,但已和销毁的ZedGraph控件解绑,再次创建窗体时未重新绑定新的GraphPane,导致数据无法显示。 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
相关产品推荐
相关产品推荐

