我有一个 datagridview,它在用户输入无效值的编辑模式下为每个单元格显示一个通知错误图标。该图标位于单元格的最右侧。当用户将鼠标移到通知错误图标上时,我检查鼠标位置是否在包含通知错误图标的区域内。如果是这样,我会显示一个带有单元格 errorText 消息的工具提示。在 datagridview 上移动鼠标的代码下方。对象 currentEditCellToolTip 下方是一个全局 ToolTip 对象,currentEditCellRectangle 是单元格最右侧包含 nofity 错误图标的区域。
private void GridViewMouseMove(object sender, MouseEventArgs e)
{
// MouseHover event is too slow to update coordinates so used MouseMove
// to get immediatelly response.
Point mousePosition = new Point();
DataGridView.HitTestInfo hitTestInfo;
try
{
mousePosition = datagridview.PointToClient(MousePosition);
}
catch (Exception)
{
return;
}
hitTestInfo = this.datagridview.HitTest(mousePosition.X, mousePosition.Y);
DataGridViewCell cell = this.datagridview.CurrentCell;
if (hitTestInfo.Type == DataGridViewHitTestType.Cell &&
hitTestInfo.ColumnIndex == cell.ColumnIndex &&
hitTestInfo.RowIndex == cell.RowIndex &&
this.currentEditCellRectangle.Contains(e.X - 82, e.Y - 5))
{
currentEditCellToolTip.Show(cell.ErrorText,
datagridview.EditingControl, 3000);
}
}
问题是我收到一个错误:“无法访问已处置的对象”。我用谷歌搜索,有人说工具提示中有一个内部错误,我指的是前一个窗口句柄,而不是当前窗口句柄。因此,我尝试在每次鼠标悬停在通知图标上时创建一个新的 ToolTip 实例,然后显示它,而不是始终使用具有不同错误文本和窗口句柄的相同工具提示。无论如何,它继续说“无法访问已处置的对象”。
currentEditCellToolTip = new ToolTip();
currentEditCellToolTip.Show(cell.ErrorText,
datagridview.EditingControl, 3000);
当用户将鼠标移到当前处于编辑模式且出错的单元格的通知图标所在的区域上时,将显示此工具提示。
那么如何使工具提示正常工作而不会引发任何异常,如评论?
编辑 - 深度描述: 一个小例子:用户正在编辑一个单元格,他输入了一个无效值,所以我使该单元格保持在编辑模式,直到输入一个有效值并且单元格的通知错误图标显示在其最右侧. 包含此通知错误图标的区域(矩形)显示一个 errorText,描述当用户将鼠标移到该区域上时出现的错误。此消息通过工具提示显示。
现在想象一下,该用户现在为当前单元格输入一个有效值并更改为另一个他在编辑模式下进入的新单元格,并且他输入了一个无效值,因此通知错误图标显示在该单元格的最右侧和一个新的工具提示当用户将鼠标移到该区域上时会显示错误消息。依此类推....用有效值验证当前单元格并更改为另一个新单元格...
这里的问题是,与前一个单元格“EditingControl”相关联的前一个工具提示在代码执行时已经消失(内部工具提示有一个局部变量,与旧窗口相关联),这会导致引发异常。EditingControl 已更改并与新工具提示相关联,但旧工具提示继续与已消失的旧 EditingControl 相关联,因此这会导致异常。这是与工具提示相关的问题,请参见以下链接:
那么有没有办法告诉工具提示以前的editingControl已经消失,然后将新的editingControl正确关联到新的工具提示而不会引起任何异常?我需要以某种方式销毁以前的 ToolTip 吗?还是没有必要?