Операция не может быть выполнена в этом обработчике событий - PullRequest
4 голосов
/ 10 февраля 2011

Я пытаюсь удалить строку из DataGridView
Я использую два типа инструкций
A

VouchersDGV.Rows.Clear()

B

If Not DGV.Rows(RowIndex).IsNewRow Then
                DGV.Rows.RemoveAt(RowIndex)
                DGV.Refresh()
            End If

Они оба изнутри

VouchersDGV_RowValidating

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

Private Sub Supplier_prod_EscapeOnFirstRowPressed() Handles Me.EscapeOnFirstRowPressed

Чтобы удалить строку, которую я ввел выше EventHandler с

VouchersDGV_RowValidating

EventHandler и я возвращаем ту же ошибку

DGV.Rows.RemoveAt(0) {"Operation cannot be performed in this event handler."} 

Лично я не могу понять, почему это происходит и как я могу дать решение
Кто-нибудь должен знать об этой ошибке?

Ответы [ 4 ]

4 голосов
/ 10 февраля 2011

Событие RowValidating наступает после того, как пользователь изменил содержимое строки, а затем пытается перейти к другой строке. Цель «RowValidating» - позволить вам (программисту) проверить только что сделанные изменения, отменить эти изменения и / или запретить пользователю переходить в другую строку. Поэтому имеет смысл, что вам запрещено удалять текущую строку (или любую другую строку) внутри этого обработчика событий.

Мне не совсем понятно, чего вы пытаетесь достичь здесь. Событие RowValidated (не RowValidating) может работать для ваших целей.

Обновление: Я думаю, RowLeave на самом деле событие, которое вы хотите использовать, и если нет, вы можете попробовать другое событие из этого списка:

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview_events.aspx

2 голосов
/ 28 октября 2011

У меня была похожая проблема, мой элемент управления сеткой данных был связан dataBindingSource с BindingList объектов, и мне не удалось удалить строку из сетки данных. Решением для меня было удалить элемент из BindingList.

2 голосов
/ 10 февраля 2011

В момент проверки он полагается на определенное состояние, и, очевидно, он не рад начать изменение строк, когда он только просит вас подтвердить что-то. Я не могу сказать, что я виноват в этом; необходимость повторной проверки сценария после того, как каждое событие станет ... запутанным; лучше предотвратить изменение.

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

0 голосов
/ 21 августа 2012

У меня была такая же проблема.В моем случае мне нужно сохранить изменения, когда пользователь меняет выбор в DataGridView.Я использую событие RowValidating, чтобы проверить любые изменения и попросить пользователя сохранить их.Но когда я попытался сохранить изменения внутри этого обработчика, я получил исключение "Operation cannot be performed in this event handler."

. Мне было нужно событие, которое возникает после RowValidating и где я могу сохранить свои изменения.Я не нашел такого события.Поэтому я использую таймер для этого.Я запускаю таймер в событии RowValidating и сохраняю свои данные при срабатывании таймера.

Вот мой код:

private void timerForSaving_Tick(object sender, EventArgs e)
{
    if (_saveChanges)
    {
        timerForSaving.Stop();
        SaveData();
        _saveChanges = false;
    }
}

private void dataGridView1_RowValidating(object sender, DataGridViewCellCancelEventArgs e)
{
    if (_hasUnsavedChanges)
    {
        DialogResult dr = MessageBox.Show("Do you want to save changes?", "Question",
                                            MessageBoxButtons.YesNo, MessageBoxIcon.Question);

        if (dr == DialogResult.Yes)
        {
            e.Cancel = true;
            _saveChanges = true;
            timerForSaving.Start();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...