XtraGrid 允许在把数据传回到下层数据源之前,检查最终用户输入数据的有效性。 为了达到此目的,网格控件激发特定的事件,用于验证被修改的单元格和行。 使用这些事件可以避免把不正确的数据保存到绑定数据源,并且为最终用户指明出错的原因。 本文档提供与验证编辑器 (个别单元格) 相关的信息。 要获得关于验证行的信息,请参阅 对行进行验证 章节。
验证编辑器
当最终用户修改了获得焦点的单元格的取值,并且试图保存更改 (例如,通过按下 ENTER 键,或把焦点移动到其他单元格) 时,网格控件执行编辑器验证。 首先,取值自动被编辑器本身执行验证。 然后, BaseView.ValidatingEditor 事件发生,允许控制单元格取值的有效性。 可以接管该事件来提供验证标准。 例如,可以检查输入的取值是否大于一个特定的在特定范围内 (或属于某些取值列表等等) 的取值。 如果单元格的取值满足自定义标准,则把事件的 Valid 参数设置为 true。 否则,可以把它设置为 false。 Valid 参数的初始值是由编辑器的自动验证结果确定的。 注意,如果此参数被设置为 false,则在默认情况下单元格保留焦点。 这样强制用户改正输入的取值。
正被验证的取值可以通过事件的 Value 参数进行访问。 如果取值不满足标准,则可以在 BaseView.ValidatingEditor 事件处理程序中人工校正取值。 要达到此目的,则把所需的取值指派到 Value 参数。 把 Valid 参数设置为 true 允许焦点从该单元格移开。 或者可以把该参数设置为 false 来进一步通过 BaseView.InvalidValueException 事件来处理这个问题 (参阅下面)。
如果通过代码更改单元格取值,则 BaseView.ValidatingEditor 事件不发生。
如果 Valid 参数被设置为 false,则网格控件将在单元格内显示一个错误图标 ()。 当鼠标指针停留在错误图标上时,显示一个说明提示 (“Invalid Value”)。 要提供自定义错误说明,则把所需的字符串指派到此事件的 ErrorText 参数。
视图允许改变默认的错误表示方式。 要达到此目的,则接管 BaseView.InvalidValueException 事件。 此事件正好发生在 BaseView.ValidatingEditor 事件的 Valid 参数已经被设置为 false 之后。 BaseView.InvalidValueException 事件提供了许多控制错误呈现的参数。 使用 ExceptionMode 参数来指定如何响应已经发生的验证错误:
ExceptionMode 值 | 操作 |
---|---|
DisplayError | 显示一个有工具栏的错误图标。 |
Ignore | 取消新数据,并恢复为原有值。 |
NoAction | 禁止显示工具提示或抛出异常。 取值保持未修改。 |
ThrowException | 抛出一个异常。 |
注意,当通过代码修改单元格的取值时,BaseView.InvalidValueException 事件也可能发生 (例如,当取值是错误的类型时)。
在接管 BaseView.InvalidValueException 事件时,可以根据特定的需求来校正特定的单元格取值。 例如,如果最终用户输入了一个取值,它超出了特定的最大值,则可以校正该值并显示一个警告消息框。 要在 BaseView.InvalidValueException 事件处理程序中修改单元格取值,可以使用 ColumnView.SetRowCellValue 方法。 它需要一个行句柄和一个列来标识特定的单元格。 要定位获得焦点的单元格,则使用由 ColumnView.FocusedRowHandle 和 ColumnView.FocusedColumn 属性返回的值。
在某些情况下,可能需要一次为多个单元格显示错误图标 () 。 这能指明当前单元格取值与其他单元格取值产生冲突,并且最终用户必须修正其中的一个或多个单元格的取值。 要为单元格显示错误图标,则调用 ColumnView.SetColumnError 方法。 显示在错误图标的工具提示中的字符串被传递为此方法的一个参数。
BaseView.ValidateEditor 和 BaseView.PostEditor 方法允许开始验证当前活动的编辑器。 可以使用 BaseView.ActiveEditor 属性获取该编辑器。 BaseView.ValidateEditor 方法只引发验证事件。 BaseView.PostEditor 方法调用 BaseView.ValidateEditor,并且在验证通过时,把取值保存到绑定数据源。
下列代码展示了如何接管 BaseView.ValidatingEditor 事件,来为 Discount 列限制最终用户的输入。 该列仅接受介于 0 和 0.20 之间的取值。 其他取值被视为无效。 BaseView.InvalidValueException 事件被接管,来显示一个有自定义错误消息的消息框:
C# | 复制代码 |
---|---|
using DevExpress.XtraGrid.Views.Grid; using DevExpress.XtraEditors.Controls; private void gridView1_ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e) { GridView view = sender as GridView; if(view.FocusedColumn.FieldName == "Discount") { //Get the currently edited value double discount = Convert.ToDouble(e.Value); //Specify validation criteria if(discount < 0) { e.Valid = false; e.ErrorText = "Enter a positive value"; } if(discount > 0.2) { e.Valid = false; e.ErrorText = "Reduce the amount (20% is maximum)"; } } } private void gridView1_InvalidValueException(object sender, InvalidValueExceptionEventArgs e) { //Do not perform any default action e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction; //Show the message with the error text specified MessageBox.Show(e.ErrorText); } |
Visual Basic | 复制代码 |
---|---|
Imports DevExpress.XtraGrid.Views.Grid Imports DevExpress.XtraEditors.Controls Private Sub GridView1_ValidatingEditor(ByVal sender As Object, _ ByVal e As BaseContainerValidateEditorEventArgs) Handles GridView1.ValidatingEditor Dim View As GridView = sender If View.FocusedColumn.FieldName = "Discount" Then 'Get the currently edited value Dim discount As Double = Convert.ToDouble(e.Value) 'Specify validation criteria If discount < 0 Then e.Valid = False e.ErrorText = "Enter a positive value" End If If discount > 0.2 Then e.Valid = False e.ErrorText = "Reduce the amount (20% is maximum)" End If End If End Sub Private Sub GridView1_InvalidValueException(ByVal sender As Object, _ ByVal e As InvalidValueExceptionEventArgs) _ Handles GridView1.InvalidValueException 'Do not perform any default action e.ExceptionMode = DevExpress.XtraEditors.Controls.ExceptionMode.NoAction 'Show the message with the error text specified MessageBox.Show(e.ErrorText) End Sub |