Могу ли я заставить DataGridView.EndEdit вызвать событие CellValidating? - PullRequest
9 голосов
/ 08 января 2009

Я использую DataGridView в своем приложении WinForms. Моя главная цель - не дать клавише Enter перейти к следующему ряду в сетке. Я все еще хочу, чтобы клавиша ввода проверила и завершила режим редактирования.

Я нашел эту запись FAQ и подкласс DataGridView для переопределения ProcessDialogKey (). Если нажата клавиша Enter, я вызываю EndEdit (), в противном случае я вызываю base.ProcessDialogKey ().

Отлично работает, за исключением события CellValidating.

В настоящее время я просто вручную вызываю логику проверки перед вызовом EndEdit, но, похоже, я что-то упустил.

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

Ответы [ 5 ]

11 голосов
/ 02 мая 2009

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

    protected override bool ProcessDialogKey(Keys keyData)
    {
        if (keyData == Keys.Enter)
        {
            DataGridViewCell currentCell = CurrentCell;
            EndEdit();
            CurrentCell = null;
            CurrentCell = currentCell;
            return true;
        }
        return base.ProcessDialogKey(keyData);
    }
6 голосов
/ 20 марта 2012

Код JJO будет зависать, если ячейка находится в режиме редактирования. Ниже избегает исключения проверки:

DataGridViewCell currentCell = AttachedGrid.CurrentCell;
        try
        {             
            AttachedGrid.EndEdit();
            AttachedGrid.CurrentCell = null;
            AttachedGrid.CurrentCell = currentCell;
        }
        catch 
        {
            AttachedGrid.CurrentCell = currentCell;
            AttachedGrid.CurrentCell.Selected = true; 
        }

Источник: Ответ Кеннета Харриса здесь

2 голосов
/ 05 апреля 2010

если источником данных вашего DataGridView является BindingSouce, сделайте это (укажите это в ваших событиях обработки ключей ):

bds.EndEdit();

если источником данных вашего DataGridView является DataTable:

this.BindingContext[dgv.DataSource].EndCurrentEdit();
1 голос
/ 05 апреля 2010

спасибо за решение. моя версия немного отличается от вашей, потому что, когда я перехожу в другую ячейку, и мой код возвращает e.cancel = false в событии проверки ячейки, генерируется ошибка, которая говорит: программа не может зафиксировать или выйти из изменения значения ячейки ". поэтому я поставил попробовать поймать, чтобы преодолеть эту проблему.

это мой код:

Protected Overrides Function ProcessDialogKey(ByVal keyData As System.Windows.Forms.Keys) As Boolean

    Dim key As Keys = (keyData And Keys.KeyCode)

    If key = Keys.Enter Then
        If MyBase.CurrentCell.ColumnIndex = 1 Then
            Dim iRow As Integer = MyBase.CurrentCell.RowIndex

            MyBase.EndEdit()
            Try
                MyBase.CurrentCell = Nothing
                MyBase.CurrentCell = MyBase.Rows(iRow).Cells(1)
                frmFilter.cmdOk_Click(Me, New EventArgs)
            Catch ex As Exception
            End Try

            Return True
        End If
    End If

    Return MyBase.ProcessDialogKey(keyData)
End Function
0 голосов
/ 08 января 2009

Нет, но вы можете вручную запустить событие CellValidating. Просто создайте правильные параметры. Все события - это класс, использующий шаблон наблюдателя, они ничем не отличаются от любого другого метода. Если это не сработает, вы можете создать событие KeyPress в ячейке и эмулировать нажатие клавиши «Ввод» в ячейке, но это может испортить пользовательский интерфейс пользователя, просто верните карат туда, где он был.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...