XtraGrid 提供了方法来为获得焦点的整条记录及其任何单元格获取和设置错误。 例如,可以校验获得焦点的记录,如果遇到无效数据,则为特定的单元格设置错误。 通过显示一个错误图标,网格控件将指明已设置了错误的记录及其单元格。 本章节描述由 XtraGrid 提供的实现这些目的的方法。
为获得焦点的记录及其单元格设置的错误是有用的,例如,当验证用户输入时。 XtraGrid 允许通过 BaseView.ValidatingEditor 和 ColumnView.ValidateRow 事件验证最终用户输入的数据。 接管这些事件时,可以为特定的单元格或整条记录设置错误,来指明无效的数据。 要获得更多关于验证的信息,请参阅 验证编辑器 和 对行进行验证 章节。
内部 ErrorInfo 支持
要指明获得焦点的记录的特定单元格包含了无效数据,则可以调用 ColumnView.SetColumnError 方法。 这允许为特定的列或整条记录设置错误说明。 也可以使用 ColumnView.SetColumnError 方法的有一个 ErrorType 参数的重载来指定错误类型。 错误类型标识了显示在单元格内的错误图标。 可用使用下面的预定义错误图标: , 和 。 另外,可以提供自定义错误图标。
如果为列设置了错误说明,则在相应的单元格内显示一个错误图标。 如果为记录设置了错误说明,则在 行指示器 的单元格内 (对于网格视图),以及在 卡片标题 (对于卡片视图) 中显示一个错误图标。 下面的插图分别举例说明了为网格视图中的单元格和为卡片视图中的记录所设置的错误:
网格视图 | 卡片视图 |
---|---|
如果需要提供更复杂的错误表示形式,则可以使用 自定义绘制 和 外观 技术。 例如,可能需要通过在包含了无效值的列的标头中显示自定义信息来指明错误。 要达到此目的,则可以接管 GridView.CustomDrawColumnHeader 事件。
要获取和清除列/记录的错误,则使用下列方法:-
ColumnView.ClearColumnErrors 为获得焦点的整条记录及其单元格移除错误说明。 要为特定的单元格或只为记录清除错误说明,则调用 ColumnView.SetColumnError 方法时把它的 errorText 参数设置为空字符串。
在行验证通过之后,网格控件自动调用 ColumnView.ClearColumnErrors 方法。
- ColumnView.GetColumnError 和 ColumnView.GetColumnErrorType 返回已经为特定单元格或为获得焦点的整条记录所设置的错误说明及错误类型。
- ColumnView.HasColumnErrors 检查记录或单元格是否被指派了错误。
要为其他数据源提供错误支持,则需要实现 IDataErrorInfo 或 IDXDataErrorInfo 接口。 请参阅 为数据源实现 ErrorInfo 支持 章节获知示例。
示例
假设网格视图中包含两个列: “StartTime” 和 “EndTime”。 在同一行中,第一个列中的值必须小于第二个列中的值。 因此在把数据保存到数据源之前,需要对行执行验证。 为了达到此目的,接管了 ColumnView.ValidateRow 事件。
如果行验证失败,则通过 ColumnView.SetColumnError 方法使用相应的错误说明,为列设置错误。 当鼠标指针停留在错误图标上时,错误说明将被显示。
为了阻止显示默认的错误消息框,接管了 ColumnView.InvalidRowException 事件。
下面的屏幕截图展示了在行验证未通过之后的一个网格视图。
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Base; using DevExpress.XtraGrid.Columns; private void gridView1_ValidateRow(object sender, DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e) { ColumnView view = sender as ColumnView; GridColumn column1 = view.Columns["StartTime"]; GridColumn column2 = view.Columns["EndTime"]; //Get the value of the first column DateTime time1 = (DateTime)view.GetRowCellValue(e.RowHandle, column1); //Get the value of the second column DateTime time2 = (DateTime)view.GetRowCellValue(e.RowHandle, column2); //Validity criterion if (time1 >= time2) { e.Valid = false; //Set errors with specific descriptions for the columns view.SetColumnError(column1, "The value must be less than EndTime"); view.SetColumnError(column2, "The value must be greater than StartTime"); } } private void gridView1_InvalidRowException(object sender, DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs e) { //Suppress displaying the error message box e.ExceptionMode = ExceptionMode.NoAction; } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Base Imports DevExpress.XtraGrid.Columns Private Sub GridView1_ValidateRow(ByVal sender As Object, _ ByVal e As DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs) _ Handles GridView1.ValidateRow Dim view As ColumnView = CType(sender, ColumnView) Dim column1 As GridColumn = View.Columns("StartTime") Dim column2 As GridColumn = View.Columns("EndTime") 'Get the value of the first column Dim time1 As DateTime = CType(view.GetRowCellValue(e.RowHandle, column1), DateTime) 'Get the value of the second column Dim time2 As DateTime = CType(view.GetRowCellValue(e.RowHandle, column2), DateTime) 'Validity criterion If time1 >= time2 Then e.Valid = False 'Set errors with specific descriptions for the columns View.SetColumnError(column1, "The value must be less than EndTime") View.SetColumnError(column2, "The value must be greater than StartTime") End If End Sub Private Sub GridView1_InvalidRowException(ByVal sender As Object, _ ByVal e As DevExpress.XtraGrid.Views.Base.InvalidRowExceptionEventArgs) _ Handles GridView1.InvalidRowException 'Suppress displaying the error message box e.ExceptionMode = ExceptionMode.NoAction End Sub |