ComponentOne 利用ガイド
[002] 別コントロールでの検証処理のキャンセル後に、C1FlexGrid をクリックしても、クリックしたセルが選択されない
移行ガイド > 各種移行資料 > WinForms 移行情報 > FlexGrid for WinForms 移行情報 > [002] 別コントロールでの検証処理のキャンセル後に、C1FlexGrid をクリックしても、クリックしたセルが選択されない
変更バージョン 2.5.20044.197
カテゴリ 動作
対応策

詳細

旧バージョンでは、フォームに C1FlexGrid 以外に別のコントロール(例:TextBox)が存在し、そのコントロールでの入力値の検証処理(※)が実装されている場合、そのコントロールに不正な値を入力して検証処理をキャンセルした後、C1FlexGrid をクリックしてフォーカスを C1FlexGrid に移動すると、C1FlexGrid のセルが選択され、C1FlexGrid の RowColChange イベントが発生しました。本バージョンでは、同様の操作で、C1FlexGrid のセルは選択されず、C1FlexGrid の RowColChange イベントは発生しません。

※入力値の検証処理の例

private void textBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e)
{
 if (textBox1.Text == "a")
 {
 e.Cancel = true;
 }
}
Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
 If TextBox1.Text = "a" Then
 e.Cancel = True
 End If
End Sub

これは、C1FlexGrid のクリックにより標準の検証イベントのチェーンを発生させ、別コントロールでの検証がキャンセルされた場合はそこにフォーカスを残したまま、C1FlexGrid の現在の選択状態を維持するように、動作が変更されたためです。

旧バージョンと同様の動作にするには、C1FlexGrid の MouseDown イベント内で Select メソッドを使用して、マウスクリックしたセルを選択状態にしてください

private void c1FlexGrid1_MouseDown(System.Object sender, System.Windows.Forms.MouseEventArgs e)
{
 HitTestInfo hti = c1FlexGrid1.HitTest(e.X, e.Y);
 int r = hti.Row;
 int c = hti.Column;
 c1FlexGrid1.Select(r, c);
}
Private Sub C1FlexGrid1_MouseDown(sender As System.Object, e As System.Windows.Forms.MouseEventArgs) Handles C1FlexGrid1.MouseDown
 Dim hti As HitTestInfo = C1FlexGrid1.HitTest(e.X, e.Y)
 Dim r As Integer = hti.Row
 Dim c As Integer = hti.Column
 C1FlexGrid1.Select(r, c)
End Sub

なお、この動作変更により、例えば C1FlexGrid の GotFocus イベント内で他コントロールへのフォーカス移動処理を行うと、旧バージョンでは、クリックした位置にあるセルに選択が移動してから、他コントロールにフォーカスが移動しましたが、本バージョンでは、セルの選択は変更されずに、他コントロールにフォーカスが移動します。

この場合、旧バージョンと同様の動作にするには、GotFocus イベントの代わりに EnterCell イベントを使用してフォーカスを移動してください。

関連トピック