I'm new to CSLA , and I've started learning about validation.I have one simple form Form1
containing datagridview1
and in Column2 and Column3 StartDate and FinishDate are shown.My idea is to useErrorProvider
in this WinForm and make some validation rule like this StartDate < FinishDate and forbid saving object to database if it is not valid.
Any idea how can I do this ?
Thank you in advance! (I know how do this without csla, using INotifyPropertyChanged and IDataErrorInfor interfaces)
Here is some sample code, I've got root editable collection
[Serializable]
public class PDVCollection : BusinessBindingListBase<PDVCollection,PDV>
{
private PDVCollection()
{
AllowNew = true;
}
protected override object AddNewCore()
{
var item = PDV.PDV();
Add(item);
return item;
}
#region Factory Methods
public static PDVCollection GetAll()
{
return DataPortal.Fetch<PDVCollection>();
}
protected override void DataPortal_Update()
{
Child_Update();
}
#endregion
#region Data Access
private void DataPortal_Fetch()
{
RaiseListChangedEvents = false;
MySqlConnection con = new MySqlConnection("server=localhost;user id=root;password=1234;persistsecurityinfo=True;database=dbpos");
MySqlCommand cmd = new MySqlCommand("usp_PDVSelect", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
try
{
con.Open();
MySqlDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
var stopa = PDV.GetPDV(dr);
Add(stopa);
}
con.Close();
}
catch (Exception xcp)
{
throw xcp;
}
RaiseListChangedEvents = true;
}
}
#endregion
And code for editable child
[Serializable]
public class PDV : BusinessBase<PDV>
{
public static readonly PropertyInfo<int> IdProperty = RegisterProperty<int>(c => c.Id);
public int Id
{
get { return GetProperty(IdProperty); }
private set { LoadProperty(IdProperty, value); }
}
public static readonly PropertyInfo<Guid> UidProperty = RegisterProperty<Guid>(c => c.Uid);
public Guid Uid
{
get { return GetProperty(UidProperty); }
private set { LoadProperty(UidProperty, value); }
}
public static readonly PropertyInfo<DateTime> StartDateProperty = RegisterProperty<DateTime>(c => c.Stopa);
public DateTime StartDate
{
get { return GetProperty(StartDateProperty); }
set { SetProperty(StartDateProperty, value); }
}
public static readonly PropertyInfo<DateTime> FinishDateProperty = RegisterProperty<DateTime>(c => c.Stopa);
public DateTime FinishDate
{
get { return GetProperty(FinishDateProperty); }
set { SetProperty(FinishDateProperty, value); }
}
#region Factory Methods
internal static PDV NewPDV()
{
return DataPortal.CreateChild<PDV>();
}
internal static PDV GetPDV(MySqlDataReader dr)
{
return DataPortal.FetchChild<StopaPDV>(dr);
}
private StopaPDV()
{
}
#endregion
#region DataAccess
protected override void Child_Create()
{
LoadProperty(UidProperty, Guid.NewGuid());
base.Child_Create();
}
private void Child_Fetch(MySqlDataReader dr)
{
LoadProperty(IdProperty,Int32.Parse(dr[0].ToString()));
LoadProperty(UidProperty, Guid.Parse(dr[1].ToString()));
LoadProperty(StartDateProperty,DateTime.Parse(dr[2].ToString()));
LoadProperty(FinishDateProperty, DateTime.Parse(dr[3].ToString()));
}
private void Child_Insert()
{
MySqlConnection con = new MySqlConnection("server=localhost;user id=root;password=1234;persistsecurityinfo=True;database=dbpos");
MySqlCommand cmd = new MySqlCommand("usp_PDVInsert", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("_uid", MySqlDbType.VarChar, 36).Value = Uid;
cmd.Parameters.Add("_startTime", MySqlDbType.DataTime).Value = StartDate;
cmd.Parameters.Add("_finishTime", MySqlDbType.DataTime).Value = FinishDate;
cmd.Parameters.Add("_id", MySqlDbType.Int32).Direction = System.Data.ParameterDirection.Output;
int ID = 0;
try
{
con.Open();
cmd.ExecuteNonQuery();
ID = Convert.ToInt32(cmd.Parameters["_id"].Value);
con.Close();
}
catch (Exception xcp)
{
throw xcp;
}
}
private void Child_Update()
{
MySqlConnection con = new MySqlConnection("server=localhost;user id=root;password=1234;persistsecurityinfo=True;database=dbpos");
MySqlCommand cmd = new MySqlCommand("usp_PDVUpdate", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("_startTime", MySqlDbType.DataTime).Value = StartDate;
cmd.Parameters.Add("_finishTime", MySqlDbType.DataTime).Value = FinishDate;
try
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
catch (Exception xcp)
{
throw xcp;
}
}
private void Child_DeleteSelf()
{
MySqlConnection con = new MySqlConnection("server=localhost;user id=root;password=1234;persistsecurityinfo=True;database=dbpos");
MySqlCommand cmd = new MySqlCommand("usp_PDVDeleteById", con);
cmd.CommandType = System.Data.CommandType.StoredProcedure;
cmd.Parameters.Add("_id", MySqlDbType.Int32).Value = Id;
try
{
con.Open();
cmd.ExecuteNonQuery();
con.Close();
}
catch (Exception xcp)
{
throw xcp;
}
}
#endregion
}
Well, I've finally found solution.It was simple , few lines of code. So , if there's anyone interested in it , here it is.
First of all, we need to create class and override Execute method inside.
After we have created class, we need to override AddBusinessRule, and use Dependency in both directions.