Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# DataGridView在刷新数据时删除异常_C#_Winforms_Exception_Datagridview - Fatal编程技术网

C# DataGridView在刷新数据时删除异常

C# DataGridView在刷新数据时删除异常,c#,winforms,exception,datagridview,C#,Winforms,Exception,Datagridview,我有一种方法可以在windows应用程序中刷新我的DataGridView。这种方法有效。但当我从网格中删除一些行时,发生了一个异常,应用程序关闭 这是刷新功能: private void RefreshGrid() { try { picbx_Next.Enabled = false; picbx_Previous.Enabled = false; this.Cursor = Cursors.WaitCursor;

我有一种方法可以在windows应用程序中刷新我的
DataGridView
。这种方法有效。但当我从网格中删除一些行时,发生了一个异常,应用程序关闭

这是刷新功能:

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

这是最后一个例外:

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


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

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

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

为了解决这个问题并防止该异常的发生,我们需要取消event 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.
} 

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

是否有连接到DataGridView的事件?如果是这样,请在其中放置断点,以观察在更改网格的数据源时是否调用了一个或多个断点。这些事件可能包含无法正确处理数据源更改的代码Yes。事件连接到网格,我使用断点对这些方法进行逐步检查。所有这些都成功地完成了,但最后我得到了这个例外。我不知道是什么方法或控件引发了此错误?我正在阅读有关调用dgv_PeopleInBranch.EndEdit()的内容或
this.BindingContext[this.dgv_PeopleInBranch.DataSource].EndCurrentEdit()在更改数据源之前。谢谢Steve。第一行不会更改任何内容,但第二行代码会引发此错误:
值不能为null。参数名称:dataSource
在哪一行出现错误?根据MSDN[e.Cancel用于取消删除事件并防止行消失。--尝试了多种选项,如重置数据源或清除绑定,但没有解决问题。--这种方式可能不是最佳做法,但确实解决了问题