所谓的界面,无非用来显示或者用来编辑数据。
比如说,在软件系统中创建一个用户,那么,必须有个创建用户的Form,一个修改用户信息Form,还有一个单纯的显示用户信息Form。既然以上三种需求是针对同一个数据,那么创建一个Control应该是最合理的方案,尤其是以后维护、增强都很方便。
ACUIBaseControl就是这么一个基类。它的实现支持的情景设定:
创建
修改
只读显示
自定义的情景
所以,创建了一个Enum来表达情景:
支持的动作:
Initialize:必须的,在此指定模式
Validate:需要保存时候会对输入的内容进行Validate。
SaveChanges:真正的Save操作
NeedSave:判断时候需要Save,比如Creating模式下,一直需要Save。
完整的代码:
#region Fields
protected ACUIControlMode modeControl = ACUIControlMode.Creating;
protected Boolean flagMajorMod = false;
protected Boolean flagInit = false;
#endregion
#region Properties
public ACUIControlMode ControlMode
{
get { return modeControl; }
}
public Boolean MajorModifyFlag
{
get { return flagMajorMod; }
}
public Boolean IsInitialized
{
get { return flagInit; }
}
#endregion
#region Events
public event EventHandler MajorModifyFlagHandler;
public event ACUIBaseControlSaveModifications SaveModificationsHandler;
#endregion
#region Public methods
public Boolean Initialize(ACUIControlMode mode)
{
if (flagInit)
return false;
// Set the mode
modeControl = mode;
if (!InitializeAllModes())
return false;
// Call it
Boolean bRet = false;
switch (modeControl)
{
case ACUIControlMode.Creating:
bRet = InitializeCreatingMode();
break;
case ACUIControlMode.ChangableDisplay:
bRet = InitializeChangableDisplayMode();
break;
case ACUIControlMode.Customizing:
bRet = InitializeCustomizingMode();
break;
case ACUIControlMode.ReadOnlyDisplay:
bRet = InitializeReadOnlyDisplayMode();
break;
case ACUIControlMode.Customizing2:
bRet = InitializeCustomizing2Mode();
break;
case ACUIControlMode.Customizing3:
bRet = InitializeCustomizing3Mode();
break;
default:
break;
}
if (bRet)
{
// Set the flags
flagMajorMod = false;
flagInit = true;
}
return bRet;
}
public Boolean SaveChanges()
{
return SaveChanges(null);
}
public Boolean SaveChanges(Object obj)
{
if (!flagInit)
return false;
if (!IsNeedSave())
return true;
if (!ValidateData())
return false;
Boolean bRet = TransferData();
switch (modeControl)
{
case ACUIControlMode.Creating:
bRet = SaveCreatingChanges();
break;
case ACUIControlMode.ChangableDisplay:
bRet = SaveChangableDisplayChanges();
break;
case ACUIControlMode.Customizing:
bRet = SaveCustomizingChanges();
break;
case ACUIControlMode.Customizing2:
bRet = SaveCustomizing2Changes();
break;
case ACUIControlMode.Customizing3:
bRet = SaveCustomizing3Changes();
break;
default:
System.Diagnostics.Debug.WriteLine("Entering some mode which should NEVER occurred!");
break;
}
if (bRet &&
(SaveModificationsHandler != null))
{
//Delegate[] dels = SaveModificationsHandler.GetInvocationList();
//foreach (Delegate deg in dels)
//{ }
SaveModificationsHandler(new ACUIBaseControlSaveEventArgs(obj));
}
return bRet;
}
public Boolean ValidateData()
{
Boolean bRet = ValidateAllModes();
if (!bRet)
return false;
switch (modeControl)
{
case ACUIControlMode.Creating:
bRet = ValidateCreatingInput();
break;
case ACUIControlMode.ChangableDisplay:
bRet = ValidateChangableDisplayInput();
break;
case ACUIControlMode.Customizing:
bRet = ValidateCustomizingInput();
break;
case ACUIControlMode.Customizing2:
bRet = ValidateCustomizing2Input();
break;
case ACUIControlMode.Customizing3:
bRet = ValidateCustomizing3Input();
break;
default:
System.Diagnostics.Debug.WriteLine("Entering some mode which should NEVER occurred!");
break;
}
return bRet;
}
public Boolean SetCurrentContent(Object obj)
{
if (!flagInit)
return false;
// For creating mode, it doesn't allowed to set another object
if (modeControl == ACUIControlMode.Creating)
return false;
if (IsNeedSave())
{
if (!SaveChanges())
return false;
}
return SetCurrentObjectImpl(obj);
}
public Boolean Uninitialize()
{
if (!flagInit)
return false;
if (CleanCurrentMode())
this.flagInit = false;
else
return false;
return true;
}
#endregion
#region Protected methods
protected void SetMajorModifyFlag(Boolean bFlag)
{
if (flagMajorMod != bFlag)
{
System.Diagnostics.Debug.WriteLine(String.Format("ACUIBaseControl: Modify is changed to {0} in Mode: {1}", bFlag, modeControl));
flagMajorMod = bFlag;
if (MajorModifyFlagHandler != null)
MajorModifyFlagHandler(this, null);
}
}
#endregion
#region Virtual methods
protected virtual Boolean InitializeAllModes()
{
return true;
}
protected virtual Boolean InitializeCreatingMode()
{
// Do NOTHING here
return true;
}
protected virtual Boolean InitializeReadOnlyDisplayMode()
{
return true;
}
protected virtual Boolean InitializeChangableDisplayMode()
{
return true;
}
protected virtual Boolean InitializeCustomizingMode()
{
return true;
}
protected virtual Boolean InitializeCustomizing2Mode()
{
return true;
}
protected virtual Boolean InitializeCustomizing3Mode()
{
return true;
}
protected virtual Boolean SaveCreatingChanges()
{
return true;
}
protected virtual Boolean SaveChangableDisplayChanges()
{
return true;
}
protected virtual Boolean SaveCustomizingChanges()
{
return true;
}
protected virtual Boolean SaveCustomizing2Changes()
{
return true;
}
protected virtual Boolean SaveCustomizing3Changes()
{
return true;
}
protected virtual Boolean ValidateAllModes()
{
return true;
}
protected virtual Boolean ValidateCreatingInput()
{
return true;
}
protected virtual Boolean ValidateChangableDisplayInput()
{
return true;
}
protected virtual Boolean ValidateCustomizingInput()
{
return true;
}
protected virtual Boolean ValidateCustomizing2Input()
{
return true;
}
protected virtual Boolean ValidateCustomizing3Input()
{
return true;
}
protected virtual Boolean TransferData()
{
return true;
}
public virtual Boolean IsNeedSave()
{
if (modeControl == ACUIControlMode.Creating)
return true;
else if (modeControl == ACUIControlMode.ReadOnlyDisplay)
return false;
else if (modeControl == ACUIControlMode.ChangableDisplay)
return flagMajorMod;
return false;
}
protected virtual Boolean SetCurrentObjectImpl(Object obj)
{
return true;
}
protected virtual Boolean CleanCurrentMode()
{
return true;
}
#endregion
}
其中,Save时需要涉及的EventArgs以及对应的Delegate:
#region Fields
private Object insObj = null;
#endregion
#region Properties
public Object InstanceObject
{
get { return insObj; }
}
#endregion
}
public delegate void ACUIBaseControlSaveModifications(ACUIBaseControlSaveEventArgs e);