我有一个具有多个控件和网格视图控件的窗口表单,我想为此表单添加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的情况下,我会混淆如何记录和维护更改。
答案 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个元素时,请删除第一个条目。 现在,您应该能够在适当的列表中为每个控件找到每个值。