2013-07-11 55 views
0

我有一个窗体窗体,有多个控件和网格视图控件,我想为这个窗体添加20个撤消重做功能,请帮助。撤消窗口窗体和gridcontrol重做

dtStates = new DataTable(); 
      DataColumn dcIndex = new DataColumn("ID", typeof(int)); 
      dcIndex.AutoIncrement = true; 
      dcIndex.AutoIncrementSeed = 1; 
      dcIndex.AutoIncrementStep = 1; 
      dtStates.Columns.Add(dcIndex); 

      dtStates.Columns.Add("Control", typeof(Object)); 
      dtStates.Columns.Add("Type", typeof(Object)); 
      dtStates.Columns.Add("Value", typeof(String)); 
      dtStates.Columns.Add("ControlID", typeof(String)); 

这是数据表,我记录的GridView的情况下,form.But的所有动作,我很迷惑如何记录和维护的变化。

+0

展示你的工作,告诉人们你尝试过什么。 –

回答

0

为每个要为每个控件撤销/重做的属性创建一个列表。将这种属性的每个变化保存到该列表中。每次列表超过20个元素时,请删除第一个条目。 现在,您应该能够找到每个值,以便在适当的列表中为您的每个控件。

+0

是的,我创建了一个所有操作的列表,它是为简单的控件工作,但不工作gridControl ..( – Ankit

+0

看看纪念品设计模式。 – Sebi

1

您的GridView只显示DataTable中的数据或更好的List中的数据。您需要保存这些数据。实际上你的数据源。要保存对象,您需要执行深层复制(How do you do a deep copy of an object in .NET (C# specifically)?)。那么你只需要一个列表来保存不同的版本。如果您使用备忘录设计模式和泛型,则可以为撤销/重做构建一个通用类,您可以在其他程序或组件中使用该类。

也许我的例子可以帮助:

[Serializable()] 
public class clsSchnappschuss<T> 
{ 
    private MemoryStream mvArbeitspeicherZugriff; 
    private BinaryFormatter mvFormatierer; 

    public clsSchnappschuss() 
    { 
     if (Attribute.GetCustomAttribute(typeof(T), typeof(SerializableAttribute)) == null) 
     { 
      Trace.WriteLine(string.Concat(typeof(T).FullName, 
              " ist nicht serialisiebar!")); 
      throw new InvalidOperationException(string.Concat(string.Format("{0} ist nicht serialisierbar.", 
                      typeof(T).FullName), 
                      " Die Klasse muss das Attribut ", 
                      "Serializable einbinden ", 
                      "[Serializable()] ", 
                      "um clsSchnappschuss verwenden zu ", 
                      "können.")); 
     } 

     mvFormatierer = new BinaryFormatter(); 
    } 

    public clsSchnappschuss<T> BxSpeichern(T obj) 
    { 
     mvArbeitspeicherZugriff = new MemoryStream(); 
     mvFormatierer.Serialize(mvArbeitspeicherZugriff, obj); 
     return this; 
    } 

    public T BxWiederherstellen() 
    { 
     mvArbeitspeicherZugriff.Seek(0, SeekOrigin.Begin); 
     mvFormatierer.Binder = new clsCustomBinder(); 
     T obj = (T)mvFormatierer.Deserialize(mvArbeitspeicherZugriff); 
     mvArbeitspeicherZugriff.Close(); 
     return obj; 
    } 
} 

在这个类中的数据将被存储:

public class clsAufbewahrer<T> 
{ 
    private List<clsSchnappschuss<T>> Liste; 

    public clsAufbewahrer() 
    { 
     Liste = new List<clsSchnappschuss<T>>(10); 
    } 

    public clsAufbewahrer(int listenKapazität) 
    { 
     Liste = new List<clsSchnappschuss<T>>(listenKapazität); 
    } 

    public List<clsSchnappschuss<T>> Schnappschuesse 
    { 
     get; 
     set; 
    } 
}