3

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

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

想象一下用户改变了一个,我想要的是验证这个单元格,以便在我的数据源中修改相应的值,而无需在单元格外部单击。

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

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

谢谢,

4

3 回答 3

2

这取决于你想做什么。你有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

于 2013-03-08T13:11:24.003 回答
1

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

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

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

于 2013-03-08T10:37:22.320 回答
0

接受的答案,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
于 2020-05-04T07:19:55.943 回答