0

我有一个具有多个控件和网格视图控件的窗口窗体,我想为此窗体添加 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 的情况下,我很困惑如何记录和维护更改。

4

2 回答 2

1

您的 GridView 只显示来自 DataTable 的数据,或者更好地显示来自 List 的数据。您需要保存这些数据。事实上你的数据源。要保存您的对象,您需要对其进行深拷贝(如何在 .NET(特别是 C#)中对对象进行深拷贝?)。然后你只需要一个列表来保存不同的版本。如果您使用 memento 设计模式和泛型,您可以为撤消/重做构建一个通用类,您也可以在其他程序或组件中使用它。

也许我的例子可以帮助:

[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; 
    }
}
于 2013-07-11T11:58:04.213 回答
0

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

于 2013-07-11T09:53:25.343 回答