【问题标题】:DataGridView Deleting Exception on Refresh Data刷新数据时DataGridView删除异常
【发布时间】:2013-05-28 11:47:40
【问题描述】:

我有一种方法可以在 Windows 应用程序中刷新我的 DataGridView。这种方法有效。但是当我从 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 文件中有异常!请注意,刷新功能完全可以在表单加载时正常工作。

这是最后的例外:

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

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

【问题讨论】:

  • 您有连接到 DataGridView 的事件吗?如果是这样,在其中放置断点以观察在更改网格的 DataSource 时是否调用了一个或多个。这些事件可能包含无法正确处理数据源更改的代码
  • 是的。事件连接到网格,我使用断点逐步检查这些方法。他们都成功完成了,但最后我得到了这个例外。不知道是什么方法或控件引发了这个错误?
  • 我正在阅读有关在更改数据源之前调用 dgv_PeopleInBranch.EndEdit();this.BindingContext[this.dgv_PeopleInBranch.DataSource].EndCurrentEdit(); 的信息。
  • 谢谢史蒂夫。第一行没有改变任何东西,但第二个代码引发了这个错误:Value cannot be null. Parameter name: dataSource
  • 在哪一行出现错误?

标签: c# winforms exception datagridview


【解决方案1】:

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

当我调用另一个函数从数据库和网格数据源中删除当前记录时,事件参数索引更改为 -1。我还更改了RefreshGrid() 方法上的网格数据源。因此网格行完全改变,最后一行在事件 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.
} 

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

【讨论】:

  • 根据 MSDN [j.mp/13v66hC] e.Cancel 用于取消删除事件并防止行消失。 - 尝试了多个选项,例如重置数据源或清除绑定,但没有解决问题。 -- 这样,可能不是最佳做法,但可以解决问题
猜你喜欢
  • 1970-01-01
  • 2010-09-20
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-06
  • 1970-01-01
相关资源
最近更新 更多