WebBrowser内のあるタグの有無を調べてるのですが

解決


じゅんてん  2008-05-21 02:30:59  No: 139759  IP: 192.*.*.*

WebBrowserで表示した、あるサイトのID属性の有無を調べてるのですが
WebBrowser1_DocumentCompleted  時に以下の命令を行うとerrormessage1が存在してる場合はいいのですが、errormessage1が存在してない場合、何故か
最初のIFで抜けてしまいます。
この理由がわからず困ってます。

 If WebBrowser1.Document.GetElementById("errormessage1").Children.Count > 0 Then
            MsgBox("error1")
        elseIf WebBrowser1.Document.GetElementById("errormessage1").Children.Count > 0 Then
            MsgBox("error2")  
        Else
            MsgBox("OK")
        End If

環境VB2005です
よろしくお願いします。

編集 削除
魔界の仮面弁士  2008-05-21 03:18:03  No: 139760  IP: 192.*.*.*

エラー処理の為に、それら If 〜 End If を、Try ブロックに入れてみれば、
Catch ブロックに引っかかるかと思いますよ。

> errormessage1が存在してない場合
GetElementById の戻り値を見て、存在チェックを行いましょう。


> 最初のIFで抜けてしまいます。
errormessage1 が無い場合、GetElementById が Nothing になりますから
その後の Children プロパティにアクセスしようとした段階で、
NullReferenceException が発生します。

で、[デバッグ]-[例外]の設定を変更しない限りは、DocumentCompleted 内の
ハンドルされていない例外が拾われないので、1 行目で処理が中断されて
いるかのように見えていたのでは無いかと。

編集 削除
じゅんてん  2008-05-21 16:00:59  No: 139761  IP: 192.*.*.*

ご返答頂きありがとうございました。

        Try
            Dim error1 As Object = WebBrowser1.Document.GetElementById("errormessage1").InnerHtml

        Catch ex As NullReferenceException
            'errormessage1  が無い場合の処理
            MsgBox("errormessage1が無い場合の処理")

            Exit Sub

        End Try

        'errormessage1があった場合の処理
        MsgBox("errormessage1があった場合の処理")

エラーから先に処理するのでちょっと変ですが
一先ず出来ましたのでご報告します。
errormessage1が複数あった場合は苦労すると思いますが
エラーの理由がわかったので、なんとかなりそうです。

この度はありがとうございました。

編集 削除
じゅんてん  2008-05-21 16:02:36  No: 139762  IP: 192.*.*.*

>>errormessage1が複数あった場合は苦労すると思いますが
↑↑↑↑
訂正です
errormessage1、errormessage2と複数あった場合は苦労すると思いますが

編集 削除
魔界の仮面弁士  2008-05-21 16:51:12  No: 139763  IP: 192.*.*.*

そういう事ではなく、元の
>  If WebBrowser1.Document.GetElementByID("errormessage1").Children.Count > 0 Then
>     MsgBox("error1")
>  Else
というコードを、たとえば
  x = WebBrowser1.Document.GetElementById("errormessage1")
  If x Is Nothing Then
      MsgBox("error0")  'errormessage1 が無い場合
  ElseIf x.Children.Count > 0 Then
      MsgBox("error1")  'errormessage1 があるが、子要素が無い場合
  Else
のように変更しましょう、という話です。
NullReferenceException の発生有無で処理すべきではありません。

Catch するように書いたのは、あくまでも問題を把握するための「実験コード」としての意味です。

編集 削除
じゅんてん  2008-05-21 17:58:47  No: 139764  IP: 192.*.*.*

やはりエラーから処理するのは止めた方がいいのですね。
勉強になります。

わざわざコードまで書いて頂きありがとうございました。
この度は助かりました。有難うございました。

編集 削除