1、控制UI控件的可视和可编辑属性
它的实现原理是在对象初使化的时候,通过方法InitializePropertyState 把需要隐藏或者要设为只读的控件设为它的状态类型。这里有个状态类型的玫举BizObjectPropertyStateType 它分别有ReadOnly, Hidden, Editable.系统会把所有具有状态的域收集到一个Hashtable 中。
{
base.InitializePropertyState();
this.OnBizObjectPropertyStateEvent(new BizObjectPropertyStateEventArgs(BizObjectPropertyStateType.ReadOnly, "Notes"));
this.OnBizObjectPropertyStateEvent(new BizObjectPropertyStateEventArgs(BizObjectPropertyStateType.Hidden, "WebSiteURL"));
}
protected virtual void OnBizObjectPropertyStateEvent(BizObjectPropertyStateEventArgs e)
{
this.mPropertyState[e.Property()] = e;
if (BizObjectPropertyStateEvent != null)
{
BizObjectPropertyStateEvent(this, e);
}
}
在UI中,UI初使化时,会相应的查测控件的属性状态,并设置所有的状态。根据对象的属性状态就可以控制UI控件的隐藏,或者只读。
{
BizObjectPropertyStateEventArgs[] PropertyStates;
PropertyStates = forThisBizObject.GetPropertyState();
foreach (BizObjectPropertyStateEventArgs PropertyState in PropertyStates)
{ SetControlEditMode(forThisBizObject, PropertyState.Property().ToString(), PropertyState.Type());
}
}
protected void SetControlEditMode(BizObject forThisBizObject, Control theControl, BizObjectPropertyStateType editMode)
{
bool enableControl=false;
if (editMode == BizObjectPropertyStateType.Editable)
{
theControl.Visible = true;
if (((bool)(mEnableEditControls[forThisBizObject])))
{
enableControl = true;
}
else
{
enableControl = false;
}
}
else if (editMode == BizObjectPropertyStateType.Hidden)
{
theControl.Visible = false;
enableControl = false;
}
else if (editMode == BizObjectPropertyStateType.ReadOnly)
{
theControl.Visible = true;
enableControl = false;
}
EnableControl(theControl, enableControl);
}
2 对于用户在UI中输入的数据的验证是放在对象实体中。对应的方法是 Validate.当验证与条件不符合时,把这个错误寄存到一个ArrayList中,并引发相关事件。在UI中进行捕获,并进行相关的处理。下面几个方法从名字上面可以看出实际的意义。
{
bool valid;
valid = base.Validate();
if (mFirstName[AttributeValueVersion.Current].Length <= 0)
{
valid = false;
this.OnBizObjectErrorEvent(new BizObjectErrorEventArgs(BizObjectErrorType.Invalid, "FirstName is requared!", "FirstName"));
}
return valid;
}
3一对一,一对多
当然一个对象实体存在 一个或者多个 一对一、一对多时,对象实体中就需要手对声明。一对一声明为DataHolder,一对多声明为CollectionDataHolder.
ContactAssociationCollectionDataHolder mContactAssociations;
private AddressDataHolder mAddress;
protected void InstantiateObjects2()
{
mPhoneNumbers = new PhoneNumberCollectionDataHolder(this);
mPhoneNumbers.BizObjectCollectionInstantiated += new EventHandler<BizObjectCollectionInstantiatedEventArgs>(BizObjectCollectionInstantiatedHandler);
mContactAssociations = new ContactAssociationCollectionDataHolder(this);
mContactAssociations.BizObjectCollectionInstantiated += new EventHandler<BizObjectCollectionInstantiatedEventArgs>(BizObjectCollectionInstantiatedHandler);
mAddress = new AddressDataHolder();
mAddress.BizObjectInstantiated += new BizObjectInstantiatedEventHandler(BizObjectInstantiatedHandler);
}
protected override void GetChildrenDataObjects(DataSet ds)
{
if (this.mPhoneNumbers.IsInstantiated)
{
mPhoneNumbers.PhoneNumberCollection.GetDataObjectDataTable(ds);
}
if (this.mContactAssociations.IsInstantiated)
{ mContactAssociations.ContactAssociationCollection.GetDataObjectDataTable(ds);
}
if (this.mAddress.IsInstantiated)
{
mAddress.Address.GetDataObjectRow(ds);
}
}
protected override void RefreshChildren(DataSet ds)
{
if (this.mPhoneNumbers.IsInstantiated)
{
mPhoneNumbers.PhoneNumberCollection.Refresh(ds);
}
if (this.mContactAssociations.IsInstantiated)
{
mContactAssociations.ContactAssociationCollection.Refresh(ds);
}
if (this.mAddress.IsInstantiated)
{
mAddress.Address.Refresh(ds);
}
}
protected override void CancelEditChildren()
{
if (this.mPhoneNumbers.IsInstantiated)
{
mPhoneNumbers.PhoneNumberCollection.CancelEdit();
}
if (this.mContactAssociations.IsInstantiated)
{
mContactAssociations.ContactAssociationCollection.CancelEdit();
}
if (this.mAddress.IsInstantiated)
{
mAddress.Address.CancelEdit();
}
}
protected override void CloneChildren(BizObject bobj)
{
Contact contactBobj = bobj as Contact;
if (this.mPhoneNumbers.IsInstantiated)
{
contactBobj.mPhoneNumbers.PhoneNumberCollection = mPhoneNumbers.PhoneNumberCollection.Clone(true) as PhoneNumberCollection;
}
if (this.mContactAssociations.IsInstantiated)
{
contactBobj.mContactAssociations.ContactAssociationCollection = mContactAssociations.ContactAssociationCollection.Clone(true) as ContactAssociationCollection;
}
if (this.mAddress.IsInstantiated)
{
contactBobj.mAddress.Address = mAddress.Address.Clone(true) as Address;
}
}
4 多对多的处理
多对多一般都有一个中间表。对应的就有一个多对多的实体对象。一个多对多的实体对象包括了两个实体对象。在Demo 中GetContactAssociations 是获取的中间对象实体。
{
return mContactAssociations.ContactAssociationCollection;
}
在一个对象中创建中间的对象实体方法如下。
{
ContactAssociation ca=null;
if (CustomerBO != null)
{
ca = ContactAssociationFactory.GetInstance().CreateBizObject() as ContactAssociation;
ca.Contact = this;
ca.Customer = CustomerBO;
}
return ca;
}
对于多对多在UI中也要加入相应的处理方法:
private void lnkCreate_LinkClicked( object sender, LinkLabelLinkClickedEventArgs e)
{
Customer CustomerBO;
CustomerBO = CustomerFactory.GetInstance().CreateBizObject() as Customer;
CustomerEdit.ShowOnce(CustomerBO);
CustomerBO.BizObjectUpdatedEvent += new EventHandler<BizObjectUpdatedEventArgs>(CustomerBO_BizObjectUpdatedEvent);
}
void CustomerBO_BizObjectUpdatedEvent( object sender, BizObjectUpdatedEventArgs e)
{
if (sender is Customer)
{
Customer CustomerBO = sender as Customer;
CustomerBO.BizObjectUpdatedEvent -= new EventHandler<BizObjectUpdatedEventArgs>(CustomerBO_BizObjectUpdatedEvent);
if (CustomerBO.IsPersisted && CustomerBO.IsDirty)
{
AddCustomerToGrid(CustomerBO);
}
}
}
private void AddCustomerToGrid(Customer CustomerBO)
{
ContactAssociation ca;
ca = (this.BizObject as Contact).CreateContactAssociation(CustomerBO);
(this.BizObject as Contact).GetContactAssociations().Add(ca);
}