Winforms DataGridView NullReferenceException在失去焦点后初始化EditingControlValue时发生异常

Winforms DataGridView NullReferenceException在失去焦点后初始化EditingControlValue时发生异常,winforms,datagridview,focus,nullreferenceexception,Winforms,Datagridview,Focus,Nullreferenceexception,我将DataGridView绑定到一个[部件]列表。列表中的最后一项始终是“虚拟零件”,用于在网格中创建一个额外的行,以便用户可以开始在第一个单元格中键入以将零件添加到列表中。 当用户在该特定单元格中键入超过x个字符时,一个带有搜索结果的新DataGridView将显示在他正在键入的单元格下(稍微看一下Google的建议),他可以选择一个匹配项将该部分添加到列表中 我通过处理EditControlShowing事件来实现这一点,该事件将“编辑控件”分配给具有TextChanged处理程序的Tex

我将DataGridView绑定到一个[部件]列表。列表中的最后一项始终是“虚拟零件”,用于在网格中创建一个额外的行,以便用户可以开始在第一个单元格中键入以将零件添加到列表中。 当用户在该特定单元格中键入超过x个字符时,一个带有搜索结果的新DataGridView将显示在他正在键入的单元格下(稍微看一下Google的建议),他可以选择一个匹配项将该部分添加到列表中

我通过处理EditControlShowing事件来实现这一点,该事件将“编辑控件”分配给具有TextChanged处理程序的TextBox变量

错误:

如果用户点击向下箭头键,我希望焦点切换到第二个DataGridView(搜索结果)。 EditControlShowing处理程序第一次工作正常,将焦点移动到第二个DataGridView,并使第一个DataGridView处于“似乎”功能状态,即所有其他事件处理程序都工作。但第二次启动EditControlShowing处理程序时,DataGridView会在InitializeEditingControlValue上抛出NullReferenceException。 因为抛出错误的是DataGridView自己的调用,所以调试器将我带到代码中的“Application.Run”,这没有帮助。 但是,我确定导致DataGridView进入该状态的调用以及引发异常的点是在我通过对第二个DataGridView(或任何其他控件)调用focus()从第一个DataGridView窃取焦点时。 但是,如果我让用户将焦点更改为DataGridView(例如,通过单击鼠标),那么DataGridView将保持良好状态

有人知道为什么在EditControlShowing的处理程序中从DataGridView中窃取焦点会导致它以后的行为有所不同吗

我尝试过取消编辑、刷新、启用/禁用等

有什么建议可以帮助我了解DataGridView中发生了什么?通过在前后的断点处检查,我无法发现任何明显的东西。我甚至不知道如何找出哪个对象是空的,因为它是DataGridView自己的代码


非常感谢。

好的,我在TextChanged事件处理程序中使用BeginInvoke解决了这个问题(代码在Boo中,但应该有意义):

我以前曾尝试在另一个控件上调用Focus()时直接使用BeginInvoke,如下所示:

private def CellAsTextBoxTextChanged(sender as object, e as EventArgs):
    ...
    ShowPartSelectionArea(currentCell, _CellAsTextBox.Text)

private def ShowPartSelectionArea(currentCell as DataGridViewCell, searchString as string):
   ...
   self.BeginInvoke(AnotherDataGridView.Focus())
   ...
但后者不起作用,可能是因为第一种方法实际上允许DataGridView的单元格完成它所做的一切,而第二种方法则不允许

因此,对于任何面临相同问题的人,我建议您在调用堆栈中使用BeginInvoke的位置进行操作

private def CellAsTextBoxTextChanged(sender as object, e as EventArgs):
    ...
    ShowPartSelectionArea(currentCell, _CellAsTextBox.Text)

private def ShowPartSelectionArea(currentCell as DataGridViewCell, searchString as string):
   ...
   self.BeginInvoke(AnotherDataGridView.Focus())
   ...