亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

對圖表中的系列撤消操作

對圖表中的系列撤消操作

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 關注
  • 171 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號