using System; using System.Collections.Generic; using System.Data; using System.Linq; using System.Text; using System.Windows.Forms; namespace Mesnac.Basic.Service { /// <summary> /// UndoRedo服务类 /// </summary> public class UndoRedoService { #region 字段定义 private static Dictionary<Control, EventHandlerProcessor> _dicControlEventHandler = new Dictionary<Control, EventHandlerProcessor>(); #endregion #region 属性定义 /// <summary> /// Undo操作栈 /// </summary> public static Stack<ICommand> UndoStack = new Stack<ICommand>(); /// <summary> /// Redo操作栈 /// </summary> public static Stack<ICommand> RedoStack = new Stack<ICommand>(); /// <summary> /// 控件事件处理绑定集合 /// </summary> public static Dictionary<Control, EventHandlerProcessor> DicControlEventHandler { get { return _dicControlEventHandler; } } #endregion #region Undo Redo服务初始化 /// <summary> /// Undo Redo服务初始化 /// </summary> /// <param name="controls">要注册UndoRedo服务的控件集合</param> public static void Init(List<Control> controls) { Clear(); EventHandlerProcessor ehp = null; foreach (Control ctl in controls) { if (ctl is TextBox) { ehp = new EventHandlerProcessor((ctl as TextBox).Text); _dicControlEventHandler.Add(ctl, ehp); (ctl as TextBox).LostFocus -= ehp.TextBox_LostFocus; (ctl as TextBox).LostFocus += ehp.TextBox_LostFocus; } if (ctl is CheckBox) { ehp = new EventHandlerProcessor((ctl as CheckBox).Checked); _dicControlEventHandler.Add(ctl, ehp); (ctl as CheckBox).CheckedChanged -= ehp.CheckBox_CheckedChanged; (ctl as CheckBox).CheckedChanged += ehp.CheckBox_CheckedChanged; } if (ctl is ComboBox) { ehp = new EventHandlerProcessor((ctl as ComboBox).SelectedItem); _dicControlEventHandler.Add(ctl, ehp); (ctl as ComboBox).SelectedIndexChanged -= ehp.ComboBox_SelectedIndexChanged; (ctl as ComboBox).SelectedIndexChanged += ehp.ComboBox_SelectedIndexChanged; } if (ctl is DateTimePicker) { ehp = new EventHandlerProcessor((ctl as DateTimePicker).Value); _dicControlEventHandler.Add(ctl, ehp); (ctl as DateTimePicker).ValueChanged -= ehp.DateTimePicker_ValueChanged; (ctl as DateTimePicker).ValueChanged += ehp.DateTimePicker_ValueChanged; } if (ctl is DataGridView) { DataTable dtOld = Mesnac.Basic.DataProcessor.GetDataTableFromGridView((ctl as DataGridView)); ehp = new EventHandlerProcessor(dtOld); _dicControlEventHandler.Add(ctl, ehp); (ctl as DataGridView).CellValueChanged -= ehp.DataGridView_CellValueChanged; (ctl as DataGridView).CellValueChanged += ehp.DataGridView_CellValueChanged; } } } #endregion #region 清除操作栈 /// <summary> /// 清除操作栈 /// </summary> public static void Clear() { foreach(Control ctl in _dicControlEventHandler.Keys) { if (ctl is TextBox) { (ctl as TextBox).LostFocus -= _dicControlEventHandler[ctl].TextBox_LostFocus; } if (ctl is CheckBox) { (ctl as CheckBox).CheckedChanged -= _dicControlEventHandler[ctl].CheckBox_CheckedChanged; } if (ctl is ComboBox) { (ctl as ComboBox).SelectedIndexChanged -= _dicControlEventHandler[ctl].ComboBox_SelectedIndexChanged; } if (ctl is DateTimePicker) { (ctl as DateTimePicker).ValueChanged -= _dicControlEventHandler[ctl].DateTimePicker_ValueChanged; } if (ctl is DataGridView) { (ctl as DataGridView).CellValueChanged -= _dicControlEventHandler[ctl].DataGridView_CellValueChanged; } } _dicControlEventHandler.Clear(); UndoStack.Clear(); RedoStack.Clear(); } #endregion } }