Windows 窗体应用程序异常

Posted

技术标签:

【中文标题】Windows 窗体应用程序异常【英文标题】:Windows form application exception 【发布时间】:2010-12-20 21:30:26 【问题描述】:

我得到应用程序异常

   at System.Windows.Forms.CurrencyManager.get_Item(Int32 index)
   at System.Windows.Forms.CurrencyManager.get_Current()
   at System.Windows.Forms.DataGridView.DataGridViewDataConnection.OnRowEnter(DataGridViewCellEventArgs e)
   at System.Windows.Forms.DataGridView.OnRowEnter(DataGridViewCell& dataGridViewCell, Int32 columnIndex, Int32 rowIndex, Boolean canCreateNewRow, Boolean validationFailureOccurred)
   at System.Windows.Forms.DataGridView.SetCurrentCellAddressCore(Int32 columnIndex, Int32 rowIndex, Boolean setAnchorCellAddress, Boolean validateCurrentCell, Boolean throughMouseClick)
   at System.Windows.Forms.DataGridView.OnCellMouseDown(HitTestInfo hti, Boolean isShiftDown, Boolean isControlDown)
   at System.Windows.Forms.DataGridView.OnCellMouseDown(DataGridViewCellMouseEventArgs e)
   at System.Windows.Forms.DataGridView.OnMouseDown(MouseEventArgs e)
   at System.Windows.Forms.Control.WmMouseDown(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.DataGridView.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.Run(Form mainForm)
   at MedForms.Program.Main() in F:\Projects\Vstu\MedForms\MedForms\Program.cs:line 18
   at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
   at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
   at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
   at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean ignoreSyncCtx)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Threading.ThreadHelper.ThreadStart()

每次我尝试点击 DataGridView 时。

我收到错误消息

"索引 -1 没有值。" (SystemIndexOutOfRange 异常)。

在行

Application.Run(new MainForm());

我无法调试它。请帮我找出可能导致此类问题的原因以及如何调试它?

【问题讨论】:

异常信息是什么?您现在最大的线索是对CurrencyManager 的引用。网格用货币做什么?具体来说,你点击的那一行的数据有什么问题吗? 与 David 一起,完整的堆栈跟踪是什么?这缺少重要信息 这是完整的堆栈跟踪。没有别的了......我可以添加错误消息是“索引 -1 没有值。”(SystemIndexOutOfaRange 异常)。我将其添加到问题中。 我赌的是“IndexOutOfRangeException”,因为 CurrencyManager 报告的当前行位置偏移量为 -1。 我不使用货币。 DataGridView 只有 5 列:1 个日期、2 个文本和 2 个按钮。 【参考方案1】:

我猜您已将一个最初为空的列表(或其他类型的不生成列表更改事件的集合)绑定到您的DataGridView,然后将项目添加到此列表中。

您添加的项目将在您的网格上正确显示,但单击一行会导致此异常。这是因为底层CurrencyManager 将报告其当前行位置作为偏移量-1。它将保持这种状态,因为 List 不会报告对网格的更改。

您应该只将列表绑定到网格中,如果它有一些项目开始,或者在添加它们时重新绑定。

另请参阅我对this 问题的回答,这基本上是相同的问题。

【讨论】:

是的,我是绑定列表。我会尝试在绑定之前检查列表是否为空。 如果在绑定数据List<of T>DataGridView之前需要将List<of T>转换为DataTable(通过将List<of T>转换为DataTable)并将其用作@ 987654330@。对我来说,这比转换为BindingList (of T) 更好,因为在数据绑定DataGridView.DataSource = BindingList (of T) 之后它在DataGridView 中显示1 个空行,即使BindingList (of T) 也是空的 将列表(假设 DataLst)绑定到 DataGridView 的数据源时,使用 Grid.DataSource = DataLst.ToList(); 进行绑定;【参考方案2】:

按照安迪的建议,我替换了

private List<Employee> Employees get; set; = new List<Employee>(); _employeesGridView.DataSource = Employees;

private BindingList<Employee> Employees get; set; = new BindingList<Employee>(); _employeesGridView.DataSource = Employees;

问题就消失了。

【讨论】:

【参考方案3】:

经过大量努力,我已经解决了这个问题。绑定您的 DataGridView 当您在数据源中有一些数据时,它将是一个列表或 DataTable。

【讨论】:

以上是关于Windows 窗体应用程序异常的主要内容,如果未能解决你的问题,请参考以下文章

Windows窗体应用程序中的进度栏 异常

配置系统未能在 Windows 窗体中初始化异常

在“错误的行”中抛出异常(C#、Windows 窗体、VS2017)

如何在 Windows 窗体应用程序中创建全局错误处理程序?

Windows 窗体应用程序中的多线程调用?

c# 用 FindWindowEx 获取子窗体时 出异常