以窗口形式和gridcontrol撤消重做

时间:2013-07-11 09:41:28

标签: c# devexpress

我有一个具有多个控件和网格视图控件的窗口表单,我想为此表单添加20个级别的撤消重做功能,请帮忙。

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的情况下,我会混淆如何记录和维护更改。

2 个答案:

答案 0 :(得分:1)

您的GridView只显示DataTable中的数据或更好地显示List中的数据。您需要保存此数据。实际上是你的数据源。要保存对象,您需要对其进行深层复制(How do you do a deep copy of an object in .NET (C# specifically)?)。然后你只需要一个列表来保存不同的版本。如果您使用memento设计模式和泛型,您可以为undo / redo构建一个通用类,您也可以在其他程序或组件中使用它。

也许我的例子可以提供帮助:

[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; 
    }
}

答案 1 :(得分:0)

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