无法在此事件处理程序中执行操作

时间:2011-02-10 17:02:45

标签: .net visual-studio-2010 datagrid datagridview

我正在尝试从DataGridView中删除一行 我使用两种类型的指示

VouchersDGV.Rows.Clear()


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

他们都来自

VouchersDGV_RowValidating

事件
我还使用RaiseEvent从另一个事件处理程序运行它 最后一个事件处理程序,我正在使用它在行错误输入时从行内部逃逸或者...将数据网格带到它的初始位置 活动是

Private Sub Supplier_prod_EscapeOnFirstRowPressed() Handles Me.EscapeOnFirstRowPressed

要删除我从

输入上面的EventHandler的行
VouchersDGV_RowValidating

EventHandler和我收回同样的错误

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

就我个人而言,我无法理解为什么会发生这种情况以及如何提供解决方案 有没有人知道这个错误?

4 个答案:

答案 0 :(得分:4)

在用户更改了行的内容然后尝试移动到另一行后,会触发RowValidating事件。 'RowValidating'的目的是让您(程序员)检查刚刚进行的更改并取消这些更改和/或阻止用户移动到另一行。那么,有意义的是,您被禁止删除此事件处理程序中的当前行(或任何其他行)。

我不清楚你要在这里完成什么。 RowValidated事件(不是RowValidating)可能适用于您的目的。

更新:我认为RowLeave实际上是您要使用的事件,如果不是,您可以尝试此列表中的其他事件:

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

答案 1 :(得分:2)

在验证时,它依赖于某个特定的状态,当你只是要求你验证某些东西时,它显然不乐意你开始更改行。我不能说我责备它;必须在每个事件发生后重新验证场景......令人困惑;更好地防止变化。

您可以在另一个回调的计时器上对要删除的项目进行排队,或者可能在验证过程中有一种说“不”的机制。

答案 2 :(得分:2)

我遇到了类似的问题,我的datagridview控件被dataBindingSource绑定到对象的BindingList,我无法从datagrid中删除一行。我的解决方案是从BindingList中删除一个项目。

答案 3 :(得分: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();
        }
    }
}