问题描述
问题信息
我已将 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 (将#修改为@)