- PR -

Validatingでは

1
投稿者投稿内容
トッティ
ベテラン
会議室デビュー日: 2008/04/01
投稿数: 64
投稿日時: 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
コード--------------------------------------------------------

という内容ですが
根本的に間違っているのでしょうか?

ご教授よろしくお願いします。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2008-04-01 23:46
引用:

トッティさんの書き込み (2008-04-01 20:48) より:

索引画面でコードを選択したあと、 Call txtTCD_Validating(Nothing, Nothing)で
データ内容を表示しようとしている


念のために尋ねますが、「Call txtTCD_Validating(Nothing, Nothing)」ですね?

引用:

コード:
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




 本当に、すぐに抜けますか?例外が発生していませんか?
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-04-02 10:58
根本的にイベントが何たるか誤解しているのがまずいと思います。 イベントは外から起こすものではなく内側で勝手に起こるものです。 Validating イベントは検証用のイベントなので、外からメソッドとして呼んでしまうと非常にわかりにくいソースができあがります。 少なくともイベント引数で弊害が出てしまいます。 それを避けようとすると無駄な分岐ができてしまい、非常にわかりにくくなります。(実際現状のコードは読み難いです)

本題とは関係ないですが、Option Strict On にしておくことをお勧めします。 いろいろ回避しているつもりかもしれませんが漏れがあります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
トッティ
ベテラン
会議室デビュー日: 2008/04/01
投稿数: 64
投稿日時: 2008-04-02 19:03
申し訳ございません。

Jittaさんの指摘で

Call txtTCD_Validating(Nothing, Nothing)
ではなく
Call txtTCD_Validating(txtTCD, Nothing)

でいけました。

すいません。
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 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 でしていることを、日本語で表現してみると、次のようになります。
コード:
txtTCD に入力された値を、数値に変換してみる。

もし、(イベントを発生させたオブジェクトの Text プロパティの、余分な空白を除去した後の長さが 0) _
  または、(txtTCD に入力された数値が 0)ならば、
    入力は正しくないので、再入力を促す
もし終わり

データを取得する

データを表示する


このうち、「データを取得する」と、「データを表示する」というのは、入力値を検証する処理としては不要なはずです。これらは、Validated イベントなどへ追い出すべきでしょう。

4.ただのtypoだと思いますが
frmSAKUIN は、Dispose する必要があります。frmAEIGS020 を Dispose する必要はないと思います。
1

スキルアップ/キャリアアップ(JOB@IT)