我的Winform应用程序在根级别记录AppDomain.CurrentDomain.UnhandledException
和Application.ThreadException,我得到了这个例外:
System.InvalidOperationException:由于对象的当前状态,操作无效。在System.Windows.Forms.Forms.Forg.Cn上的System.Windows.Forms.DataGridView.DataGridViewDataConnection.currencyManager_ListChanged(Object sender,ListChangedEventArgs e)的System.Windows.Forms.DataGridView.DataGridViewDataConnection.ProcessListChanged(ListChangedEventArgs e)处于System.Windows.Forms.CurrencyManager.OnListChanged(ListChangedEventArgs e)at at System.ComponentModel.BindingList
1.OnListChanged(ListChangedEventArgs e) at System.ComponentModel.BindingList
的System.Windows.Forms.CurrencyManager.List_ListChanged(Object sender,ListChangedEventArgs e)System.ComponentModel.BindingList1.InsertItem(Int32 index, T item) at System.Collections.ObjectModel.Collection
的1.FireListChanged(ListChangedType类型,Int32索引)1。在System.ComponentModel.BindingList1.AddNewCore() at System.ComponentModel.BindingList
处添加(T项)System.SWindows.Forms.Forms.Fornd.Cand中的System.Windows.Forms.Currencyl.IBindingManager.AddNew()的System.ComponentModel.IBindingList.AddNew()。 System.Windows.Forms.DataGridView.OnRowEnter上的System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnNewRowNeeded()中的AddNew()(DataGridViewCell& dataGridViewCell,Int32 columnIndex,Int32 rowIndex,Boolean canCreateNewRow,B System.Windows.Forms.DataGridView.ProcessDownKeyInternal(Keys keyData,Boolean&)中的System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex,Int32 rowIndex,Boolean setAnchorCellAddress,Boolean validateCurrentCell,Boolean throughMouseClick)中的oolean validationFailureOccurred)。在System.Windows.Forms上的System.Windows.Forms.Data.ProcessDialogKey(Keys keyData)处的System.Windows.Forms.DataGridView.ProcessEnterKey(Keys keyData)处于System.Windows.Forms的System.Windows.Forms.Control.ProcessDialogKey(Keys keyData)处。 System.Windows.Forms.Application上System.Windows.Forms.Control.PreProcessControlMessageInternal(Control target,Message& msg)的System.Windows.Forms.Control.PreProcessMessage(Message& msg)中的.TextBoxBase.ProcessDialogKey(Keys keyData)。 ThreadContext.PreTranslateMessage(MSG& msg)
这是ex.ToString()的结果,它不返回我的应用程序的自定义代码,只返回内部的System.Windows.Forms方法。
在某些客户机器上不时会出现异常,我甚至无法自己重现它。
这种气味不好,当我更改datagridview的数据源边界时,我的假设就出现了。但在这种情况下,我应该至少在异常堆栈中看到我的类,但这里没有。
找到根本原因或调试的任何线索?
非常感谢
答案 0 :(得分:1)
如果您调查堆栈跟踪,您将看到问题的根源:客户正在尝试在网格上添加新记录,因此事件处理程序尝试将记录添加到数据源,这会导致另一个事件handler,它试图将一条记录添加到绑定列表中,导致事件currencyManager_listChanged
启动,由于对象的错误状态而失败。
您可以处置您的清单,也可以不取消订阅处置控件的事件。
答案 1 :(得分:1)
我遇到了完全相同的异常,它发生在用户删除多行(启用多选)并在选择中包括最后一行之后。最后一行用于添加新项目。一切正常,直到用户随后编辑剩余的行,然后发生异常。
如果用户未在选择中包括最后一个/添加新项目的行,则删除后一切正常。
我没有时间确切地调查为什么会发生此行为,但是解决方法是当多选项目时不允许添加新项目行,IsNewRow
可以检测到该选择行属性DataGridViewRow
,然后如果选择了此行,则在DataGridView上调用ClearSelection()
。
private void DataGridView1_SelectionChanged(object sender, EventArgs e)
{
foreach (DataGridViewRow row in dataGridView1.SelectedRows)
{
if (row.IsNewRow)
{
dataGridView1.ClearSelection();
return;
}
}
}