【问题标题】:Operation cannot be performed in this event handler无法在此事件处理程序中执行操作
【发布时间】:2011-06-25 00:26:31
【问题描述】:

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

VouchersDGV.Rows.Clear()

B

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."} 

我个人不明白为什么会发生这种情况以及如何提供解决方案
有人知道这个错误吗?

【问题讨论】:

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


    【解决方案1】:

    我遇到了同样的问题。就我而言,当用户更改 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();
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        RowValidating 事件在用户更改行的内容并尝试移动到另一行后触发。 'RowValidating' 的目的是让您(程序员)检查刚刚所做的更改并取消这些更改和/或防止用户移动到不同的行。因此,禁止您删除此事件处理程序中的当前行(或任何其他行)是有道理的。

        我不太清楚你在这里想要完成什么。 RowValidated 事件(不是 RowValidating)可能会为您的目的而工作。

        更新:我认为RowLeave 实际上是您想要使用的事件,如果不是,您可以尝试从该列表中选择不同的事件:

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

        【讨论】:

        • 我按照你说的做了(这确实是有道理的)但返回了同样的错误!?!我只想删除当前行,并初始化 DataGridView
        • 我知道那个地方,但对我一点帮助都没有,因为这个地方只是对事件的参考,我需要的是删除一行的确切位置。另一方面,我已经以更好的结构重建它,并且知道我正在寻找放置此事件的确切位置(删除)
        【解决方案4】:

        在验证时,它依赖于特定状态,当它只要求您验证某些内容时,您显然不乐意开始更改行。我不能说我责怪它;在每个事件之后都必须重新验证场景会变得……令人困惑;更好地防止变化。

        您可以改为在另一个回调的计时器上将项目排队等待删除,或者可能有一种机制可以在验证期间说“不”。

        【讨论】:

        • @Marc 我要做的是删除当前行(保存数据后)并初始化 DataGridView。
        • @Lefteris 简单地说:验证不是这样做的时候
        • @Lefteris:如果您通过单击“保存”按钮 (?) 之类的操作来保存数据,则删除当前行并在那里重新初始化 DGV(即在 Save按钮的点击事件)。
        • @MusiGenesis 我没有使用任何按钮,但我在离开第一行后保存数据(这是我们需要做的),然后我必须初始化 DataGridView
        • @Marc 是的,我现在知道了,我正试图将它放在另一个事件中,该事件发生在我离开该行之后?!?!?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-21
        • 2018-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多