Проверка ячеек в DevExpress GridControl

Просто вопрос, с которым я не справлюсь.

У меня есть DevExpress GridControl для Winforms (12.2), заполненный некоторыми числовыми значениями, сетка редактируется, и пользователь может изменять эти значения.

Представьте, что пользователь меняет один, я хочу проверить эту ячейку, чтобы получить соответствующее значение, измененное в моем источнике данных, не щелкая за пределами ячейки.

То есть я хочу, чтобы пользователь мог проверять и применять все значения, просто нажимая кнопку на панели инструментов, не нажимая Enter, esc или щелкая в таблице.

Я искал несколько форумов и не получил правильного ответа

Спасибо,


person danijepg    schedule 08.03.2013    source источник


Ответы (3)


В вашем обработчике для menuItem_click сделайте что-нибудь вроде этого:

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

Это заставляет представление проверять ввод и передавать его в источник данных.

person Jens Kloster    schedule 08.03.2013
comment
Для меня этот метод сбрасывает текущее значение объекта источника данных в строку, переопределяя значение пользователя. Я ищу обратное поведение. UpdateCurrentRow возвращает true. Я проверил документацию DevExpress и кажется, что вы правы со своими объяснениями, но все еще не работает, есть идеи? - person danijepg; 08.03.2013
comment
@danijepg обрабатываете ли вы какие-либо другие события в gridview? - person Jens Kloster; 08.03.2013
comment
Mouseclick, RowCellStyle и CustomDrawCell, но ни один из них не имеет ничего общего с проверкой ячеек. Щелчок мышью предназначен только для меню. В ячейке, которую я пытаюсь изменить, нет специального редактора, это целое число - person danijepg; 08.03.2013
comment
Забыл, установщик этого свойства выдает странное исключение из-за другой проблемы. UpdateCurrentRow работает нормально, так что ваше решение правильное. Благодарность!!! - person danijepg; 08.03.2013

Это зависит от того, чем вы хотите заниматься. у вас есть 2 варианта. либо проверьте строку, либо верните окно сообщения с сообщением об ошибке. или у вас может быть этот маленький красный крестик внутри ячейки

оба метода будут работать. но требуют немного других реализаций. оба метода требуют, чтобы вы подписались на событие Validate row для gridview, а не на gridcontrol.

что-то вроде этого даст вам текстовое поле;

private void gridView1_ValidateRow(object sender,
DevExpress.XtraGrid.Views.Base.ValidateRowEventArgs e) 
{
    e.Valid = false;
}

и что-то вроде этого даст вам красный крестик в ячейке;

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

person wterbeek    schedule 08.03.2013

Принятый ответ UpdateCurrentRow () делает именно то, что говорит - заставляет представление обновить свой результат, возвращая false, если это невозможно из-за ошибки проверки. Но это не вся история.

Чтобы вызвать ошибку проверки, вам необходимо использовать ValidateRow или ValidatingEditor. Итак, они используются вместе.

Разница в том, что ValidatingEditor работает при перемещении между полями.

Этот пример взят отсюда https://docs.devexpress.com/WindowsForms/3055/controls-and-libraries/data-grid/examples/data-editing/how-to-validate-data-entered-конечнымипользователями

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
person Philip Johnson    schedule 04.05.2020