为什么这里设置headerText会退出线程,而不是抛出异常?

问题描述

问题信息

我已将 CellValueChanged 处理程序添加dataGridView,这导致它无法再正确加载。

执行初始化的 VB .net 代码如下所示(一些标识符名称已更改):

Private Sub DesignMyView(ByRef dgv As DataGridView)
    With CType(dgv.Columns(dgv.Columns.Add(New DataGridViewComboBoxColumn())),DataGridViewComboBoxColumn)
        .DataSource = New DataView(dtMyView)
        .ValueMember = "ID"
        .displayMember = "Name"
        .Name = "fkFirstColumn"
        .HeaderText = "Hello"
        .MaxDropDownItems = 20
        .Width = 140
   End With

这应该做的很简单:向网格视图添加一列。但由于某种原因,它不会正确执行。我已将问题缩小到 .HeaderText = "Hello" 行。如果我不设置标题文本,代码将运行。但是,当我设置标题文本时,会发生一些非常奇怪的事情。

首先,使用 F11 (Step Into) 单步执行代码代码将运行到 HeaderText 行,然后,而不是继续设置 .MaxDropDownItems 函数,下一条指令 VS 显示me 是一个完全不同的文件中的一行:包含此 .Show() 的表单的 DataGridView 函数。设置该表单内容的线程死亡,执行跳回。换句话说,在终止线程的 HeaderText setter 中正在执行的操作。

有趣的是,HeaderText 正在设置,虽然这个结果显然是不可取的:那个视图包含不止一列,现在只显示第一列,并且缺少表单它的内容减半,因为 init 线程被终止了。即使打开所有可能的调试选项,也没有任何类型的异常或消息。

看反汇编,VS产生:

  1178:             .HeaderText = "Hello"
00C19552 CC                   int         3  
00C19553 15 BC B7 82 04       adc         eax,482B7BCh  
00C19558 8B 4D BC             mov         ecx,dword ptr [ebp-44h]  
00C1955B 39 09                cmp         dword ptr [ecx],ecx  
00C1955D E8 DE 17 AB 7A       call        7B6CAD40  
00C19562 90                   nop  

在反汇编窗口中时,可以进一步执行步骤。但是,一旦到达 call 7B6CAD40(位于 forms.dll 中的某处),VS 拒绝显示更多程序集,几秒钟后返回,线程消失。突然,我现在在这里

   203:             frm.Show()
00BE5BE9 8B 4D C0             mov         ecx,dword ptr [ebp-40h]  
00BE5BEC 39 09                cmp         dword ptr [ecx],ecx  
00BE5BEE E8 61 4C 41 7A       call        7AFFA854  
00BE5BF3 90                   nop  

在这里停止了搜索(事情变得非常复杂)并采用了不同的方法。相反,向新的 CellValueChanged 事件添加断点表明,当 HeaderText 更改时,CellValueChanged 实际上是使用 RowIndex = -1 调用的。显然,Header 被认为是一种索引为 -1 的特殊 Cell,并且这个内部实现细节被毫不客气地转发给用户(也see here)。当然,这并没有被检查,所以函数内部的代码抛出了一个数组越界异常。

问题:

然而,所说的异常从未真正显示出来,这让我陷入了疯狂的追逐,使得查找和修复实际问题花费的时间远远超过应有的时间。

  • 我的异常跑到哪里去了?
  • 为什么要这样做?
  • 我怎样才能防止这种红鲱鱼?

到目前为止,我的假设是 CellValueChanged 线程中的异常导致这里的 .NET 运行时代码中的表单初始化线程被杀死,但如何以及为什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)