C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Validating後にCheckBoxが変更できなくなる

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■87873 / inTopicNo.1)  Validating後にCheckBoxが変更できなくなる
  
□投稿者/ ka2 (1回)-(2018/07/09(Mon) 17:57:15)

分類:[VB.NET/VB2005 以降] 

2018/07/09(Mon) 17:58:15 編集(投稿者)

いつもお世話になっております。
VS2013Proを使用しています。

TabControl上にTextBoxとCheckBoxを配置しTextBoxのValidatingで
Textのチェックを行い、不正な値だった場合はe.Cancel=Trueで
フォーカス移動が行われないようにしています。

タブインデックスはTabControl→TextBox→CheckBoxとしています。

特定の操作を行うと、CheckBoxのチェック状態が変更できなくなってしまい
困っております。

コードは以下の内容のみでコントロールはWindows標準コントロールを使用しています。

Public Class Form1

Private Sub TextBox1_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles TextBox1.Validating
If Me.TextBox1.Text <> "" Then
e.Cancel = True
Exit Sub
End If
End Sub
End Class


操作としては
@TextBoxに何か入力する
AShift+Tabを押下(TextBoxのValidatingでフォーカス移動がキャンセルされる)
BTextBoxの内容を削除
CTabまたはマウスクリックでCheckBoxに移動
DSpaceまたはマウスクリックでCheckBoxの状態を変更しようとする

Dでチェックの状態が変更出来なくなります。
ただし一度TabControlにフォーカスを移動させればまた
CheckBoxの状態を変更できるようになります。

この現象はなぜ発生してしまうのでしょうか?

よろしくお願いいたします。
引用返信 編集キー/
■87876 / inTopicNo.2)  Re[1]: Validating後にCheckBoxが変更できなくなる
□投稿者/ にゃるら (31回)-(2018/07/09(Mon) 21:19:09)
おそらくですけど。

CheckBoxの親ウィンドウになるTabControlのValidationCancelがTrueのままであるためMouseUp時にOnClickが呼ばれません。
OnClickの中でチェック状態を変更する処理が行われますので、チェック状態は変更されません。

原因は、Validationが走ったときのコントロールが誰であるのかがカギだと思われます。
Shift+Tabで移動したときのコントロールは「TabControl」です。
Validationが走ったときに、ValidatingがCancelしたことでTabControlがValidationCancel=Trueになります。
しかし、TextBoxを空文字列にした後、Tabで移動したときのコントロールは「CheckBox」です。
このため、ValidatingがCancelしなかったことの関係者であるTabControlには成功したことが通知されないため、
ValidationCancelがFalseにならない状態になっていると思われます。

これを思った理由は、tabcontrolのstateフィールド(VisualStudioのデバッグでクイックウォッチだと見れます)が
0x20000 (ValidationCancel)が立ちっぱなしだからです。
一方でcheckboxは立っていません。

Bugなのかもしれませんが、Validatingイベントでキャンセルすることは基本的にはWinFormの場合リスクがあります。
Validatingイベントでのキャンセルをする仕様を見直す方が無難だと思います。
引用返信 編集キー/
■87879 / inTopicNo.3)  Re[2]: Validating後にCheckBoxが変更できなくなる
□投稿者/ ka2 (2回)-(2018/07/10(Tue) 18:15:31)
No87876 (にゃるら さん) に返信

回答ありがとうございます。

> Bugなのかもしれませんが、Validatingイベントでキャンセルすることは基本的にはWinFormの場合リスクがあります。
> Validatingイベントでのキャンセルをする仕様を見直す方が無難だと思います。

値の検証とフォーカス制御はValidatingで行うことが一般的なのかと思っていましたが、
WinFormの場合はそうとも限らないということでしょうか?

とりあえず、Leaveイベントで代用できないか調査してみようと思います。
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ