【问题标题】:Validating cells in DevExpress GridControl在 DevExpress GridControl 中验证单元格
【发布时间】:2013-03-08 10:26:02
【问题描述】:

只是一个我无法管理自己的简单问题。

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

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

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

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

谢谢,

【问题讨论】:

    标签: validation devexpress datasource gridcontrol


    【解决方案1】:

    这取决于你想做什么。你有2个选择。验证该行并返回一个显示错误消息的消息框。或者你可以在单元格内有那个红色的小“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");
        }
    }
    

    信息在这里找到:http://documentation.devexpress.com/#windowsforms/DevExpressXtraGridViewsBaseColumnView_ValidateRowtopic

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

    我在这里找到了更多信息:http://www.devexpress.com/Support/Center/p/A289.aspx

    【讨论】:

      【解决方案2】:

      在 menuItem_click 的处理程序中执行以下操作:

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

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

      【讨论】:

      • 对我来说,此方法将数据源对象的当前值转储到覆盖用户值的行。我正在寻找相反的行为。 UpdateCurrentRow 正在返回 true。我检查了 DevExpress 文档,似乎您的解释是正确的,但仍然无法正常工作,有什么想法吗?
      • @danijepg 你在处理 gridview 上的任何其他事件吗?
      • Mouseclick、RowCellStyle 和 CustomDrawCell,但它们都与验证单元格无关。 Mouseclick 仅用于菜单。我要修改的单元格没有自定义编辑器,是一个整数
      • 忘记了,这个属性的设置器由于其他问题抛出了一个奇怪的异常。 updateCurrentRow 工作正常,因此您的解决方案是正确的。谢谢!!!
      【解决方案3】:

      接受的答案,UpdateCurrentRow() 完全按照它所说的 - 它强制视图更新其结果,如果由于验证错误而不能返回 false。但这还不是全部。

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

      不同之处在于 ValidatingEditor 在字段之间移动时起作用。

      这个例子取自这里https://docs.devexpress.com/WindowsForms/3055/controls-and-libraries/data-grid/examples/data-editing/how-to-validate-data-entered-by-end-users

      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();
      }
      

      我的代码通常看起来像这样(VB):

        Private Function ValidateView(view As ColumnView) As Boolean
              If view.IsEditing Then
                  view.CloseEditor()
                  Return view.UpdateCurrentRow()
              End If
              Return True
        End Function
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-07
        • 2012-05-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多