【WinForm+DevExpress】使用UnboundColumnExpressionEditorForm设置表格的行检验

第一步 定义验证的弹出框

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
using DevExpress.XtraEditors;
using DevExpress.XtraEditors.Design;
using System.ComponentModel.Design;
using DevExpress.Data;

namespace DevExpressDemo
{
    public partial class UnboundColumnExpressionEditorFormEx : UnboundColumnExpressionEditorForm
    {
        //构造函数
        public UnboundColumnExpressionEditorFormEx(object contextInstance, IDesignerHost designerHost)
            : base(contextInstance, designerHost)
        {
        }
        //验证的表达式
        public new string Expression
        {
            get { return base.Expression; }
            set { ExpressionMemoEdit.Text = value; }
        }
    }

    //根据实体类反射出列名和列类型
    public class PropertyColumnInfo : IDataColumnInfo
    {
        public PropertyColumnInfo(Type type, string name, bool withChildren = false)
        {
            FieldType = type;
            if (withChildren)
            {
                _columns = new List<IDataColumnInfo>();
                _controllerBase = new DataControllerBase();
                Caption = string.Empty;
            }
            else
            {
                _columns = null;
                _controllerBase = null;
                Caption = name;
            }
            UnboundExpression = string.Empty;
        }
        DataControllerBase _controllerBase = null;
        List<IDataColumnInfo> _columns = null;
        public List<IDataColumnInfo> Columns { get { return _columns; } }
        public DataControllerBase Controller { get { return _controllerBase; } }

        public Type FieldType { get; set; }
        public string Caption { get; private set; }
        public string FieldName { get { return Caption; } }
        public string Name { get { return Caption; } }
        public string UnboundExpression { get; set; }

        public static PropertyColumnInfo FromProperties(Type type)
        {
            PropertyColumnInfo eci = new PropertyColumnInfo(typeof(object), string.Empty, true);
            PropertyDescriptorCollection properties = TypeDescriptor.GetProperties(type);
            foreach (PropertyDescriptor property in properties)
            {
                eci.Columns.Add(new PropertyColumnInfo(property.PropertyType, property.Name));
            }
            return eci;
        }
    }
}

第二步 表格页面调用

 //创建实例
                var expressionEditor = new UnboundColumnExpressionEditorFormEx(
                    PropertyColumnInfo.FromProperties(typeof(UserInfoEntity)), null);
                //验证的表达式
                expressionEditor.Expression = "Iif([userid] = 1 And IsNullOrEmpty([username]), '用户id为1的用户,用户名不能为空', '')";
                //在验证的页面上点击了OK之后的回调
                if (expressionEditor.ShowDialog() == System.Windows.Forms.DialogResult.OK)
                {
                    //更新表达式到数据库
                    string updatesql = string.Format("update [tb_validationrule] set context='{0}' where name='userinfo'", expressionEditor.Expression.Replace("'", "''"));
                    SqlConnection conn = new SqlConnection(strCon);
                    conn.Open();
                    SqlCommand command = new SqlCommand(updatesql, conn);
                    command.ExecuteNonQuery();
                }

第三步:保存表格数据时验证

 private void barButtonItem2_ItemClick(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
        {
            try
            {
                var items = new BindingList<UserInfoEntity>();
                for (var i = 0; i < ((System.Data.DataTable)(gridControl1.DataSource)).Rows.Count; i++) { 
                  UserInfoEntity entity = new UserInfoEntity();
                  entity.userid =Convert.ToInt32( ((System.Data.DataTable)(gridControl1.DataSource)).Rows[i].ItemArray[0]);
                  entity.username = Convert.ToString(((System.Data.DataTable)(gridControl1.DataSource)).Rows[i].ItemArray[1]);
                  entity.roleid = Convert.ToString(((System.Data.DataTable)(gridControl1.DataSource)).Rows[i].ItemArray[2]);
                  entity.userstate = Convert.ToBoolean(((System.Data.DataTable)(gridControl1.DataSource)).Rows[i].ItemArray[2]);
                    items.Add(entity);
                }

                if (items == null) return;

                ExpressionEvaluator evaluator = null;
                string strValidation = "Iif([userid] = 1 And IsNullOrEmpty([username]), '用户id为1的用户,用户名不能为空', '')";
                if (!string.IsNullOrEmpty(strValidation))
                {
                    CriteriaOperator op = CriteriaOperator.Parse(strValidation);
                    evaluator = new ExpressionEvaluator(new EvaluatorContextDescriptorDefault(typeof(UserInfoEntity)), op);
                }
                foreach (var item in items) {
                    var ev = evaluator.Evaluate(item);
                    if (!string.IsNullOrEmpty(ev as string)) {
                        MessageBox.Show(ev as string);
                    }
                }
            }
            catch (Exception ex)
            {
            }
        }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值