我正在尝试从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."}
就我个人而言,我无法理解为什么会发生这种情况以及如何提供解决方案 有没有人知道这个错误?
答案 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();
}
}
}