ユーザーが無効な値を入力した編集モードで、各セルの通知エラー アイコンを表示する datagridview があります。このアイコンは、セルの右端に配置されます。ユーザーがエラー通知アイコンの上にマウスを移動すると、マウスの位置がエラー通知アイコンを含む領域内にあるかどうかを確認します。その場合、セルの errorText メッセージを含むツールチップを表示します。データグリッドビューでマウスを動かすためのコードの下。以下のオブジェクト 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を新しいツールチップに正しく関連付ける方法はありますか? 何らかの方法で以前のツールチップを破棄する必要がありますか? またはそれは必要ありませんか?