- - PR -
Validatingでは
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-04-01 20:48
こんばんは。 VB2005で開発中です。 索引画面でコードを選択したあと、 Call txtTCD_Validating(Nothing, Nothing)で データ内容を表示しようとしているのですが txtTCD_Validatingのルーチンに入ってもすぐに抜けてしまい '*** データ取得 ************** のところまで来ません。 blnSUTI = Int32.TryParse(txtTCD.Text, mlngKEYTCD)以外を コメントにすると '*** データ取得 ************** '*** データ表示 ************** まで進み選択したコードの内容が表示されます。 コード-------------------------------------------------------- Private Sub txtTCD_Validating(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles txtTCD.Validating Dim blnSUTI As Boolean Dim sb As New StringBuilder '***** If ActiveControl Is sender OrElse ActiveControl.CausesValidation = False OrElse sender.Text.Length = 0 Then Exit Sub End If '*** 入力チェック ************** blnSUTI = Int32.TryParse(txtTCD.Text, mlngKEYTCD) If Trim(sender.Text).Length = 0 OrElse mlngKEYTCD = 0 Then MessageBox.Show("得意先を正しく入力して下さい", _ Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) e.Cancel = True Exit Sub End If '*** データ取得 ************** Call mData() '*** データ表示 ************** Call mDisplay() End Sub '*** Private Sub 索引ボタンクリック Dim frmSAKUIN = New frmSAKUIN '***** If frmSAKUIN .ShowDialog = Windows.Forms.DialogResult.OK Then txtTCD.Text = frmSAKUIN .pTCD Call txtTCD_Validating(Nothing, Nothing) End If '***** frmAEIGS020.Dispose() End Sub コード-------------------------------------------------------- という内容ですが 根本的に間違っているのでしょうか? ご教授よろしくお願いします。 | ||||||||||||
|
投稿日時: 2008-04-01 23:46
念のために尋ねますが、「Call txtTCD_Validating(Nothing, Nothing)」ですね?
本当に、すぐに抜けますか?例外が発生していませんか? | ||||||||||||
|
投稿日時: 2008-04-02 10:58
根本的にイベントが何たるか誤解しているのがまずいと思います。 イベントは外から起こすものではなく内側で勝手に起こるものです。 Validating イベントは検証用のイベントなので、外からメソッドとして呼んでしまうと非常にわかりにくいソースができあがります。 少なくともイベント引数で弊害が出てしまいます。 それを避けようとすると無駄な分岐ができてしまい、非常にわかりにくくなります。(実際現状のコードは読み難いです)
本題とは関係ないですが、Option Strict On にしておくことをお勧めします。 いろいろ回避しているつもりかもしれませんが漏れがあります。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2008-04-02 19:03
申し訳ございません。
Jittaさんの指摘で Call txtTCD_Validating(Nothing, Nothing) ではなく Call txtTCD_Validating(txtTCD, Nothing) でいけました。 すいません。 | ||||||||||||
|
投稿日時: 2008-04-02 22:35
その他:
1.システム ハンガリアン記法は、もはや推奨されていません。 Dim blnSUTI As Boolean ← ここはシステム ハンガリアンなのに、 Dim sb As New StringBuilder ← こちらは違うのは、なぜ? blnSUTI より、SutiDesuka の方が、「数値ですか?」と、わかりやすいでしょう。これを、アプリケーション ハンガリアン記法といいます。 参考:Visual Basic のコーディング規則、Visual Basic の名前付け規則、一般的な名前付け規則<microsoft.com> 2.検証の仕方について 索引ボタンクリック で、txtTCD.Validating を呼び出すのは、あまり勧められる方法ではありませんが、そういう必要もあるでしょう。ここで、Sender や e に、何が入るのかをきちんと押さえてあれば、という前提が必要ですが。 今、frmSAKUIN で設定した値が、txtTCD に設定できるかどうかを確認しようとしているわけですが、そうであるなら、frmSAKUIN 側で txtTCD に設定できる値かどうかを検証しておけば、「索引ボタンクリック」イベントから呼び出す必要はなくなりますよね?また、frmSAKUIN が消える前に検証しておけば、ユーザにとって、間違った値の訂正も容易になります。 3.イベントの意味について Validating は、検証を行うイベントです。それ以外の意味を持たせないでください。 txtTCD_Validating でしていることを、日本語で表現してみると、次のようになります。
このうち、「データを取得する」と、「データを表示する」というのは、入力値を検証する処理としては不要なはずです。これらは、Validated イベントなどへ追い出すべきでしょう。 4.ただのtypoだと思いますが frmSAKUIN は、Dispose する必要があります。frmAEIGS020 を Dispose する必要はないと思います。 |
1