2013-05-28 3 views
1

У меня есть метод обновления моего DataGridView в приложении Windows. этот метод работает. но когда я удаляю некоторую строку из Grid, возникло исключение и приложение закрыто.DataGridView Удаление исключения при обновлении данных

Это Refresh функция:

private void RefreshGrid() 
{ 
    try 
    { 
     picbx_Next.Enabled = false; 
     picbx_Previous.Enabled = false; 
     this.Cursor = Cursors.WaitCursor; 

     people = context.People 
      .Where(c => c.BranchPersons.FirstOrDefault().BranchId == _BranchId) 
      .Select(c => new OrderingData 
      { 
       CellPhone = c.CellPhone, 
       Id = c.Id, 
       Firstname = c.FirstName, 
       PersonDutyId = c.PersonDutyId, 
       Surname = c.SurName 
      }) 
      .OrderByDescending(c => c.PersonDutyId) 
      .ToList(); 

     lst = new BindingList<OrderingData>(people); 
     dgv_PeopleInBranch.DataSource = lst; 

     picbx_Next.Enabled = true; 
     picbx_Previous.Enabled = true; 
     this.Cursor = Cursors.Default; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show(ex.Message); 
    } 
} 

И это моя функция удаления:

private void dgv_PeopleInBranch_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e) 
{ 
    if (dgv_PeopleInBranch.Rows.Count > 0) 
    { 
     if (ReadyForDelete) 
     { 
      Guid Id = new Guid(e.Row.Cells["Id"].Value.ToString()); 
      DeleteBranchPerson(Id); 
     } 
     else 
     { 
      e.Cancel = true; 
     } 
    } 
} 

Когда функция Delete успешно выполнить, я называю RefreshGrid() метод для загрузки новых данных из базы данных. Но у меня есть исключение в моем файле program.cs! Обратите внимание, что функция обновления работает полностью без ошибок при загрузке формы.

Это окончательное Исключение:

Индекс находился вне диапазона. Должен быть неотрицательным и меньше размера коллекции. Имя параметра: индекс

Где моя ошибка и как я могу найти, какой контроль поднял это исключение и исправить?

+0

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

+0

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

+0

Я читал о вызове 'dgv_PeopleInBranch.EndEdit();' или 'this.BindingContext [this.dgv_PeopleInBranch.DataSource] .EndCurrentEdit();' перед изменением DataSource. – Steve

ответ

0

Наконец-то я нашел проблему, где она находится. Когда мы используем событие UserDeletingRow, был создан аргумент аргумента, который содержит текущую строку удаления.

Когда я вызвал другую функцию для удаления текущей формы записи базы данных и источника данных Grid, индекс аргумента события изменился на -1. Также я изменил источник данных Grid на метод RefreshGrid(). Поэтому строки Grid полностью изменены и последняя строка, которая в параметре arg аргумента недоступна.

Чтобы решить эту проблему и предотвратить возникновение этого исключения, нам необходимо отменить параметр arg аргумента, чтобы передать это. I Изменить UserDeletingRow метод, как показано ниже, и это работает!

if (ReadyForDelete) 
{ 
    Guid Id = new Guid(e.Row.Cells["Id"].Value.ToString()); 
    DeleteBranchPerson(Id); 
    e.Cancel = true; // Set this to cancel event arg. 
} 

Спасибо всем, кто мне помог. :-)

+0

В соответствии с MSDN [http://j.mp/13v66hC] e.Cancel используется для отмены события удаления и предотвращения исчезновения строки. - Пробовал несколько параметров, таких как сброс источника данных или очистка привязки, но ничего не решить проблему. - Таким образом, может быть, не самая лучшая практика, но РЕШИТЕ ​​проблему – BiLaL

Смежные вопросы