CSLA How to validate StartDate and FinishDate?

765 views Asked by At

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
}
1

There are 1 answers

1
Hank Mooody On BEST ANSWER

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.

 public class StartFinishTimeValidation : Csla.Rules.BusinessRule
    {
        protected override void Execute(Csla.Rules.RuleContext context)
        {
            var target = (PDV)context.Target;
            //var od = (DateTime)ReadProperty(target, PDV.StartDateProperty);
            //var doo = (DateTime)ReadProperty(target, PDV.FinishDateProperty);
            if (target.StartDate > target.FinishDate)
            {
                context.AddErrorResult("The date is not correct");

            }


        }
    }

After we have created class, we need to override AddBusinessRule, and use Dependency in both directions.

protected override void AddBusinessRules()
    {
        base.AddBusinessRules();

        BusinessRules.AddRule(new StartFinishTimeValidation {PrimaryProperty = StartDateProperty });
        BusinessRules.AddRule(new Dependency(StartDate,FinishDate));
        BusinessRules.AddRule(new Dependency(FinishDate, StartDate));


    }