Validation 正在验证DevExpress GridControl中的单元格

Validation 正在验证DevExpress GridControl中的单元格,validation,devexpress,datasource,gridcontrol,Validation,Devexpress,Datasource,Gridcontrol,只是一个简单的问题,我自己都管不了 我有一个用于Winforms(12.2)的DevExpress GridControl,其中填充了一些数值,网格是可编辑的,用户可以更改这些值 假设用户更改了一个单元格,我想验证这个单元格,以便在数据源中修改相应的值,而无需单击单元格外侧的A 也就是说,我希望用户能够验证和应用所有值,只需按工具栏中的一个按钮,而不是单击enter、esc或在表中单击 我在看一些论坛,没有得到正确的答案 谢谢,在菜单项的处理程序中,单击执行以下操作: private menuI

只是一个简单的问题,我自己都管不了

我有一个用于Winforms(12.2)的DevExpress GridControl,其中填充了一些数值,网格是可编辑的,用户可以更改这些值

假设用户更改了一个单元格,我想验证这个单元格,以便在数据源中修改相应的值,而无需单击单元格外侧的A

也就是说,我希望用户能够验证和应用所有值,只需按工具栏中的一个按钮,而不是单击enter、esc或在表中单击

我在看一些论坛,没有得到正确的答案


谢谢,

在菜单项的处理程序中,单击执行以下操作:

private menuItem_Click(object sender, EventArgs e)
{
  gridView1.UpdateCurrentRow(); //return a bool, false = if validation error(s) was found
}

这将强制视图验证输入并将其下推到数据源。

这取决于您要执行的操作。你有两个选择。验证行并返回显示错误消息的messagebox。或者你可以在牢房里放一个红色的“x”

这两种方法都有效。但是需要稍微不同的实现。这两种方法都要求您订阅gridview的Validate row事件,而不是gridcontrol

像这样的东西会给你一个文本框

private void gridView1_ValidateRow(object sender,
DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e) 
{
    e.Valid = false;
}
像这样的东西会给你细胞里的红色“x”

private void gridView1_ValidateRow(object sender, 
DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e) {
    GridView view = sender as GridView;
    GridColumn inStockCol = view.Columns["UnitsInStock"];
    GridColumn onOrderCol = view.Columns["UnitsOnOrder"];
    //Get the value of the first column
    Int16 inSt = (Int16)view.GetRowCellValue(e.RowHandle, inStockCol);
    //Get the value of the second column
    Int16 onOrd = (Int16)view.GetRowCellValue(e.RowHandle, onOrderCol);
    //Validity criterion
    if (inSt < onOrd) {
        //Set errors with specific descriptions for the columns
        view.SetColumnError(inStockCol, "The value must be greater than Units On Order");
        view.SetColumnError(onOrderCol, "The value must be less than Units In Stock");
    }
}
private void gridView1\u ValidateRow(对象发送方,
DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs(e){
GridView视图=发送方作为GridView;
GridColumn inStockCol=view.Columns[“UnitsInStock”];
GridColumn OnOrderColl=view.Columns[“UnitsOnOrder”];
//获取第一列的值
Int16 inSt=(Int16)view.GetRowCellValue(e.RowHandle,inStockCol);
//获取第二列的值
Int16 onOrd=(Int16)view.GetRowCellValue(e.RowHandle,onOrderCol);
//有效性标准
如果(安装
信息可在此处找到:

这仍然需要用户退出单元格


我在这里找到了更多信息:

公认的答案UpdateCurrentRow()完全按照它所说的做-它强制视图更新其结果,如果由于验证错误而无法更新,则返回false。但这并不是全部

要导致验证错误,需要使用ValidateRow或ValidatingEditor。所以这些是一起使用的

区别在于ValidatingEditor在字段之间移动时工作

这个例子取自这里


对我来说,这个方法将数据源对象的当前值转储到覆盖用户值的行中。我正在寻找相反的行为。UpdateCurrentRow正在返回true。我已经查看了DevExpress文档,似乎您的解释是正确的,但仍然不起作用,有什么想法吗?@danijepg您是否在gridview上处理任何其他事件?鼠标单击、RowCellStyle和CustomDrawCell,但它们都与验证单元格无关。鼠标单击仅用于菜单。我试图修改的单元格没有自定义编辑器,它是一个整数。由于其他问题,此属性的setter正在抛出一个奇怪的异常。updateCurrentRow运行良好,因此您的解决方案是正确的。谢谢
using DevExpress.XtraEditors.Controls;
using DevExpress.XtraGrid.Views.Base;
using DevExpress.XtraGrid.Views.Grid;
using DevExpress.XtraGrid.Columns;

private void gridView1_ValidatingEditor(object sender, BaseContainerValidateEditorEventArgs e) {
    ColumnView view = sender as ColumnView;
    GridColumn column = (e as EditFormValidateEditorEventArgs)?.Column ?? view.FocusedColumn;
    if (column.Name != "colBudget") return;
    if ((Convert.ToInt32(e.Value) < 0) || (Convert.ToInt32(e.Value) > 1000000))
        e.Valid = false;
}

private void gridView1_InvalidValueException(object sender, InvalidValueExceptionEventArgs e) {
    ColumnView view = sender as ColumnView;
    if (view == null) return;
    e.ExceptionMode = ExceptionMode.DisplayError;
    e.WindowCaption = "Input Error";
    e.ErrorText = "The value should be greater than 0 and less than 1,000,000";
    // Destroy the editor and discard the changes made within the edited cell.
    view.HideEditor();
}
  Private Function ValidateView(view As ColumnView) As Boolean
        If view.IsEditing Then
            view.CloseEditor()
            Return view.UpdateCurrentRow()
        End If
        Return True
  End Function