1

我有一种方法可以刷新我DataGridView的 Windows 应用程序。这种方法有效。但是当我从 Grid 中删除某些行时,发生异常并且应用程序关闭。

这是刷新功能:

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文件中有异常!请注意,刷新功能在表单加载时完全没有任何错误。

这是最后的例外:

指数超出范围。必须是非负数且小于集合的大小。参数名称:索引

我的错误在哪里,如何找到引发此异常并修复它的控件?

4

1 回答 1

0

最后我找到了问题所在。当我们使用UserDeletingRow事件时,会创建包含当前删除行的事件参数。

当我调用另一个函数来删除当前记录表单数据库和网格数据源时,事件参数索引更改为 -1。我还更改了 Grid onRefreshGrid()方法的数据源。因此,网格行完全改变,最后一行在事件 arg 参数中不可用。

为了解决这个问题并防止该异常的发生,我们需要取消事件 arg 参数来释放它。我改变UserDeletingRow如下方法,它的工作原理!

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

感谢所有帮助过我的专家。:-)

于 2013-05-28T14:33:35.510 回答