DevExpress学习笔记(1)——IDXDataErrorInfo接口

来源:互联网 发布:知网社会与经济数据库 编辑:程序博客网 时间:2024/06/06 02:34

鉴于自己知识面中的欠缺,花了很多时间潜心学习了DevExpress组件。

 

    学习之前以为DevExpress只是控件,熟悉属性、方法、事件即可,后来发现远不是这么回事情,比如IDXDataErrorInfo接口。

 

 

一、IDXDataErrorInfo的基础知识

    IDXDataErrorInfo接口,用于为业务类的属性提供展示提示信息的方法。其名称空间为:DevExpress.XtraEditors.DXErrorProvider,程序集为:DevExpress.Data.版本号.dll。无父类。

 

    该接口提供了两个方法:

    void GetError(ErrorInfo info);

    void GetPropertyError(string propertyName, ErrorInfo info);

用得最多的是第二个。

 

    示例代码如下:

 

#region IDXDataErrorInfo 成员

void DevExpress.XtraEditors.DXErrorProvider.IDXDataErrorInfo.GetError(DevExpress.XtraEditors.DXErrorProvider.ErrorInfo info)
{
  return;
}

 

void DevExpress.XtraEditors.DXErrorProvider.IDXDataErrorInfo.GetPropertyError(string propertyName, DevExpress.XtraEditors.DXErrorProvider.ErrorInfo info)
{
  info.ErrorType = DevExpress.XtraEditors.DXErrorProvider.ErrorType.Information;
  switch (propertyName)
   {
    case "Category":
      if (Category == null)
        info.ErrorText = "请务必选择收支项目。";
    break;
    case "Amount":
      if (Amount == 0)
        info.ErrorText = "请录入金额。";
               break;
   }
}

#endregion


ErrorType,是用于获取或者设置信息展示的图标,有红叉叉、黄色感叹号、蓝色的i,以及多达9个自定义图标。

ErrorText,是用于获取或者设置信息的内容。

 

二、IDXDataErrorInfo的应用

    为什么会对这个接口如此感兴趣呢?是基于如下的原因:

1、可以在业务层中完成数据录入校验,而不用分散在不同的界面层去。

2、实现了该接口的业务类,可以通过和控件的绑定、包括和GridControl控件的绑定,轻松实现录入校验结果的展示。并且这种展示方式改善了我之前常用的而又比较厌恶的方式:

A、在LABEL中,用*号表示必录项,我一向认为不好看,而且即使已录入正确还有此提示;

B、用MessageBox展示错误提示信息,这个我一向认为不太礼貌。

 

应用一、与Edit控件的绑定。

    当业务类实现了该接口后,可以在录入的时候进行控件绑定,即把控件的属性和业务类的属性绑定在一起,同时把一个DXErrorProvider组件与业务类实例进行绑定。

 

    绑定示例代码如下:

    txtAmount.DataBindings.Add(new Binding("Text", m_IncExpTransaction, "Amount", true));
    cmbCategory.DataBindings.Add(new Binding("EditValue", m_IncExpTransaction, "Category", true));
    m_ErrorProvider.DataSource = m_IncExpTransaction;

 

 

其中,txtAmount是CalcEdit控件,cmbCategory是LookUpEdit控件,m_ErrorProvider是DxErrorProvider组件,m_IncExpTransaction是业务类实例。

 

 

 

    错误提示示例代码如下:

        private void btnSave_Click(object sender, EventArgs e)
        {
            if (m_ErrorProvider.HasErrors)
            {
                foreach (BaseEdit control in FirstErrorControlList)
                {
                    if (control.ErrorText.Length > 0)
                    {
                        control.Focus();    //控件获得焦点
                        control.SelectAll();  //控件的值处于选中状态
                        m_ToolTipControler.ShowHint(control.ErrorText, control, DevExpress.Utils.ToolTipLocation.TopCenter);  //用hint来显示提示信息
                        break;
                    }
                }
            }
            else
            {
                Save();
                this.Close();
            }
        }

 

        protected virtual BaseEdit[] FirstErrorControlList
        {
            get
            {
                return new BaseEdit[] { };
            }
        }
        
        protected virtual void Save()
        {
            XtraMessageBox.Show("尚未重写保存方法。");
        }

其中,FirstErrorControlList属性用于提供需要检查的控件列表,并按照列表顺序进行控件检查。m_ToolTipControler是ToolTipControler组件。

 

    效果如下:

 

1、当进入该界面时,会自动在金额和收支项目前显示i,以提示是必填项;鼠标移上去后,显示提示信息。

2、点击保存,而录入项不正确,则主动显示提示信息。

 

应用二、与GridControl控件的绑定。

    这个实际上只是在GridControl的校验事件相关。

 

    示例代码如下:

 

 

 


        protected virtual void OnGridValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e)
        {
            for (int i = 0; i < m_View.Columns.Count; i++)  //依次检查所有的列是否能校验通过
            {
                if (m_View.GetColumnError(m_View.Columns[i]).Length > 0)
                {
                    e.Valid = false;  //校验失败,激发InvalidRowException事件
                    break;
                }
            }
        }

备注:GetColumnError的值就是IDXDataErrorInfo中的错误提示,如果没有错误,则为空字符串。

 

        protected virtual void OnGridInvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e)
        {
            if (DevExpress.XtraEditors.XtraMessageBox.Show("您是否要修改尚未正确录入的数据?\n\r\n\r点击“否”将取消您的修改,恢复成原来的数据。", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
            {
                e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction;  //不作任何操作
                if (m_Form != null)
                    m_Form.MDIContainer.Focus();  //不切换子窗体
                for (int i = 0; i < m_View.Columns.Count; i++)
                {
                    if (m_View.GetColumnError(m_View.Columns[i]).Length > 0)
                    {
                        m_View.FocusedColumn = m_View.Columns[i];   //第一个错误列获得焦点
                        break;
                    }
                }
            }
            else
                e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.Ignore;  
//忽略错误并取消数据改动或者录入
        }

    效果如下: