为了账号安全,请及时绑定邮箱和手机立即绑定

对图表中的系列撤消操作

对图表中的系列撤消操作

C#
蛊毒传说 2021-11-21 15:20:41
我想在图表中多次更改一些 Yvalues[0] 后恢复以前的系列。所以我使用备忘录模式实现了撤销操作。但是它不起作用并且运行时没有错误。下面是发起人、纪念品和看守人。public class Originator{    private Series _series = new Series();    public Originator(Series series)    {        _series = series;    }    public Series OSeries    {        get        {            return _series;        }        set        {            _series = value;        }    }    public Memento SaveSeries()    {        return new Memento(_series);    }    public void RestoreSeries(Memento m)    {        this._series = m.MMseries;    } }public class Memento{    private Series _series =new Series();    public Memento(Originator org)    {        this._series = org.OSeries;    }    public Memento(Series mseries)    {        _series = mseries;    }    public Series MMseries    {        get        {            return _series;        }        set        {            _series = value;        }    }}public class Caretaker{    //  private static Caretaker _instance;    //  public Caretaker() { }    private Memento chartMemento;    public Memento Memento    {        get        { return chartMemento; }        set        {  chartMemento = value; }    }}在公共部分类 Form1 中创建对象:FormOriginator _org;Caretaker taker = new Caretaker();从文件加载图表时,open_file 函数包含以下代码:_org = new Originator(global_series); //For undo/redo operationwhile (chart1.Series.Count > 0) { chart1.Series.RemoveAt(0); }chart1.Series.Add(global_series);taker.Memento = _org.SaveSeries();对于撤消按钮:_org.RestoreSeries(taker.Memento);while (chart1.Series.Count > 0) { chart1.Series.RemoveAt(0); }global_series = _org.OSeries;chart1.Series.Add(global_series);
查看完整描述

2 回答

?
MYYA

TA贡献1868条经验 获得超4个赞

使用备忘录模式进行多次撤销操作


看护人代码:


public class Caretaker

{


    private Memento chartMemento;

    public Memento Memento

    {

        get

        { return chartMemento; }


        set

        {  chartMemento = value; }


    }

}

纪念品代码:


public class Memento

{

    private Series _series =new Series();


    public Memento(Originator org)

    {

        this._series.Points.Clear();

        foreach (var dp in org.OSeries.Points) this._series.Points.Add(dp.Clone());

    }

    public Memento(Series mseries)

    {

        this._series.Points.Clear();

        foreach (var dp in mseries.Points) this._series.Points.Add(dp.Clone());

    }


    public Series MMseries

    {

        get

        {

            return _series;

        }

        set

        {

            _series = value;

        }

    }

}

发起人代码


public class Originator{

    private Series _series = new Series();

    public Originator() { }

    public Originator(Series series)

    {

        // _series = series;

        _series.Points.Clear();

        foreach (var dp in series.Points) _series.Points.Add(dp.Clone());

    }

    public Series OSeries

    {

        get

        {

            return _series;

        }

        set

        {

            _series = value;

        }

    }


    public Memento SaveSeries()

    {

        return new Memento(_series);

    }


    public void RestoreSeries(Memento m)

    {

        //this._series = m.MMseries;


        this._series.Points.Clear();

        foreach (var dp in m.MMseries.Points) this._series.Points.Add(dp);

        this._series.ChartType = SeriesChartType.Line;

    }

}


在 Form1 中声明对象列表及其计数器


 Orginator _org;

 List<Originator> list_org = new List<Originator>();

 List<Caretaker> list_taker = new List<Caretaker>();

 int obj_counter = 0;

Do 操作的代码


 list_org.Add(_org = new Originator(global_series));

 Caretaker ct = new Caretaker();

 ct.Memento = list_org[obj_counter++].SaveSeries();

 list_taker.Add(ct);

撤销操作的代码:


  if (obj_counter > 0)

  {

     list_org[--obj_counter].RestoreSeries(list_taker[obj_counter].Memento);

     global_series.Points.Clear();

     foreach (var dp in list_org[obj_counter].OSeries.Points) 

     global_series.Points.Add(dp);

  }


查看完整回答
反对 回复 2021-11-21
?
catspeake

TA贡献1111条经验 获得超0个赞

Series是参考变量。


因此,您所做的所有更改都将针对该系列,并且您拥有的所有参考资料都将指向同一(原始)系列。


花哨的图案,因为他们有用的可能是不能代替的基础知识。要允许撤销/重做你需要复制的的数据的不是,参考!


注意Series没有Clone方法。


所以你需要自己做;在您的情况下,这归结为复制 Points ..


但是对于更一般的情况,您可能想要复制其他系列属性,最值得注意的是ChartType您为准备Series. 也许以工厂模式创建它..?


但也要注意DataPoint 确实有一个Clone方法。所以你可以Originator像这样改变你的构造函数:


public Originator(Series series)

{

    //_series = series;

    foreach (var dp in series.Points) _series.Points.Add(dp.Clone());

}

事情将开始按预期工作。但是您也需要像这样进行恢复,否则您将指向保存的系列,接下来的更改将更改它而不是图表系列..:


public void RestoreSeries(Memento m)

{

    // this._series = m.MMseries;

    this._series.Points.Clear();

    foreach (var dp in m.MMseries.Points) this._series.Points.Add(dp);

}

顺便说一句:要清除所有系列,请使用chart.Series.Clear()!


查看完整回答
反对 回复 2021-11-21
  • 2 回答
  • 0 关注
  • 134 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信