2011-02-10 3 views
4

Я пытаюсь удалить строку из DataGridView
я использую два типа instuctions

Операция не может быть выполнена в этот обработчик событий

VouchersDGV.Rows.Clear() 

В

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

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

VouchersDGV_RowValidating 

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

Private Sub Supplier_prod_EscapeOnFirstRowPressed() Handles Me.EscapeOnFirstRowPressed 

чтобы удалить строку я войти выше EventHandler из

VouchersDGV_RowValidating 

EventHandler и я забираю ту же ошибку,

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

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

ответ

2

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

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

+0

@Marc. Я пытаюсь удалить текущую строку (после сохранения данных) и инициализировать DataGridView. –

+0

@Lefteris просто: валидация - это не время, чтобы сделать это –

+0

@Lefteris: если вы сохраняете данные, делая что-то вроде нажатия кнопки «Сохранить» (?), Имеет смысл удалить текущую строку и повторно инициализировать DGV там (т. е. внутри события щелчка кнопки «Сохранить»). – MusiGenesis

4

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

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

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

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

+0

Я сделал то, что вы мне сказали (что defenetlly имеет смысл), но возвращает ту же ошибку!?! Я просто хочу удалить текущую строку и инициализировать DataGridView –

+0

Я знаю это место, но не помогу мне вообще, потому что это место - это просто ссылка на события, и мне нужна точная позиция для удаления строки. С другой стороны, я обновляю его в лучшей структуре и знаю, что я ищу точное положение для размещения этого события (removerow) –

2

У меня была аналогичная проблема, мой элемент управления datagridview был связан даннымиBindingSource с BindingList объектов, и мне не удалось удалить строку из datagrid. Решение для меня было удалить элемент из BindingList.

0

У меня была та же проблема.В моем случае мне нужно сохранить изменения, когда пользователь меняет выбор в 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(); 
     } 
    } 
} 
Смежные вопросы