第一步 定义验证的弹出框
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)
{
}
}