本主题描述如何检查最终用户在行中输入数据的有效性。 当行数据的完整性很重要时 (例如,当某些字段中的取值应取决于其他字段中的取值时) ,这种验证是有用的。 如果需要检查个别单元格中输入数据的有效性,请参阅 验证编辑器 主题。
对行进行验证
也存在需要实现行验证的情况。 当验证标准涉及几个列时,这是有用的。 例如,可能需要确保某个列的取值大于另一个列的取值。 在这种情况下,最好是允许最终用户在单元格之间移动焦点,并且在行正要失去焦点时执行验证。 要那样操作,则接管 ColumnView.ValidateRow 事件。 注意,也可以通过调用 ColumnView.UpdateCurrentRow 方法,人工发起行验证。
该事件的 RowHandle 参数标识了被执行验证的行。 要获取行的取值,举例来说,可以使用 ColumnView.GetRowCellValue 方法,此方法要求行句柄和列作为参数。 在获得单元格取值之后,就可以校验其取值是否符合验证标准。 如果行验证未通过,则把该事件的 Valid 参数设置为 false。 否则,把 Valid 参数设置为 true。
在默认情况下,如果 Valid 参数被设置为 false,则网格控件显示一个错误消息框:
单击 Yes 按钮把焦点返回到行中。 这允许最终用户校正行的取值。 如果单击了 No 按钮,则行的更改被放弃,并且焦点可以从该行移开。 注意,仅当表示记录的对象实现了 System.ComponentModel.IEditableObject 接口,回滚才发生。
可以通过事件的 ErrorText 参数提供附加的错误说明。 指派到该参数的字符串被显示在错误消息框中,并在后面跟随 “Do you want to correct the value?” 字符串。
有时可能需要为最终用户指明单元格包含了无效数据。 为达到这个目的,则调用 ColumnView.SetColumnError 方法,使用列和错误说明作为参数。 结果,相应的单元格显示一个错误图标 ()。 鼠标指针指向这个图标时,调用有特定错误说明的工具提示。 此方法允许为特定单元格和整个行设置错误。 要达到此目的,则调用 ColumnView.SetColumnError 方法,使用 null (在 Visual Basic 中为 Nothing) 作为它的 column 参数。 如果为行设置了错误,则网格控件在 行指示器单元格 中显示一个错误图标。
如果 Valid 参数被设置为 false,则 ColumnView.InvalidRowException 事件在 ColumnView.ValidateRow 事件处理程序完成之后发生。 ColumnView.InvalidRowException 事件允许重写默认的错误表示形式 (显示错误消息框)。 它提供了 ExceptionMode 参数,可以用于指定如何响应错误:
ExceptionMode 值 | 操作 |
---|---|
DisplayError | 显示有错误说明的错误消息框。 最终用户可以单击适当的消息框按钮来选择是要校正取值,还是放弃更改。 |
Ignore | 取消新数据,并恢复为原有值。 |
NoAction | 阻止显示错误消息框,阻止抛出异常。 取值保持未修改。 |
ThrowException | 抛出一个异常。 |
由于数据库约束,当被验证的行不能被保存到绑定数据源时,ColumnView.InvalidRowException 事件也发生。 在这种情况下,通常由数据源产生一个异常。 可以通过事件的 Exception 参数获取表示此异常的对象。 举例来说,可以使用此参数获取异常文本,并向最终用户显示。
当接管 ColumnView.ValidateRow 或 ColumnView.InvalidRowException 事件时,可以通过 ColumnView.SetRowCellValue 方法人工校正无效的单元格取值。 请参阅 获取和设置单元格的值 章节获得更多关于修改行的信息。
示例
假设网格视图中包含两个列: “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 |