如何验证StartDate和FinishDate

本文关键字:StartDate FinishDate 验证 何验证 | 更新日期: 2023-09-27 17:54:52

我是CSLA的新手,我已经开始学习验证。我有一个简单的形式Form1包含datagridview1和在Column2和Column3 StartDate和FinishDate显示。我的想法是使用ErrorProvider在这个WinForm和做一些验证规则像这样的StartDate <如果不合法,则禁止将对象保存到数据库。>

你知道我该怎么做吗?

提前感谢!(我知道如何做到这一点没有cla,使用INotifyPropertyChanged和IDataErrorInfor接口)

这里是一些示例代码,我有根可编辑集合

[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

和可编辑子

的代码
[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
}

如何验证StartDate和FinishDate

好了,我终于找到解决办法了。它很简单,只有几行代码。所以,如果有人对它感兴趣,在这里。

首先,我们需要在里面创建一个类并重写Execute方法。

 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");
            }

        }
    }

在我们创建了类之后,我们需要重写AddBusinessRule,并在两个方向上使用Dependency。

protected override void AddBusinessRules()
    {
        base.AddBusinessRules();
        BusinessRules.AddRule(new StartFinishTimeValidation {PrimaryProperty = StartDateProperty });
        BusinessRules.AddRule(new Dependency(StartDate,FinishDate));
        BusinessRules.AddRule(new Dependency(FinishDate, StartDate));

    }