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

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

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

Re[6]: HtmlElementのAttachEventHandler


(過去ログ 87 を表示中)

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

■51775 / inTopicNo.1)  HtmlElementのAttachEventHandler
  
□投稿者/ ほっしゅ (1回)-(2010/07/18(Sun) 07:22:22)

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

(VB 2008)
以下の質問を参考に、WebBrowser上のリンクをクリックしたときに、
VB側でも処理を行いたいと思います。

http://bbs.wankuma.com/index.cgi?mode=al2&namber=46863&KLOG=79

ここで、色々と試した結果、以下のソースのように、<a>タグにAttachEventHandlerで設定したイベントハンドラ
(以下のソースでは"Test")を設定してみましたが、<a>タグのhrefに、
<a href="#dummy">ここをクリック</a>
のように、hrefに#で始まるものが設定されている場合、ここをクリックするたびに、
イベントハンドラが呼び出される回数が増えてしまいます。
例) 1回目クリック…クリック後、イベントハンドラが1回呼び出される
   2回目クリック…クリック後、イベントハンドラが2回呼び出されてしまう
   3回目クリック…クリック後、イベントハンドラが3回呼び出されてしまう
                ・
                ・
                ・
以下にソースを記載します。
    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        For Each atag As HtmlElement In WebBrowser1.Document.GetElementsByTagName("A")
            atag.AttachEventHandler("onclick", AddressOf Test)
        Next
    End Sub

おそらく、<a href="#dummy">のリンクをクリックした場合もWebBrowser1_DocumentCompletedが発生してしまうので、
ここをクリックするたびにAttachEventHandlerで同じイベントハンドラが追加され続けるのだと思うのですが、
この回避方法はないでしょうか?
みなさまのアドバイスお願いします。

引用返信 編集キー/
■51780 / inTopicNo.2)  Re[1]: HtmlElementのAttachEventHandler
□投稿者/ やじゅ (1683回)-(2010/07/18(Sun) 13:20:13)
やじゅ さんの Web サイト
No51775 (ほっしゅ さん) に返信
> おそらく、<a href="#dummy">のリンクをクリックした場合もWebBrowser1_DocumentCompletedが発生してしまうので、
> ここをクリックするたびにAttachEventHandlerで同じイベントハンドラが追加され続けるのだと思うのですが、
> この回避方法はないでしょうか?

下記サイトのは質問内容とは違うから参考まで
ようは"#dummy"でなければAttachEventHandlerを作成しないようにすればいいのかなと
http://mixsta.blog133.fc2.com/blog-entry-4.html
引用返信 編集キー/
■51781 / inTopicNo.3)  Re[2]: HtmlElementのAttachEventHandler
□投稿者/ ほっしゅ (2回)-(2010/07/18(Sun) 14:38:47)
No51780 (やじゅ さん) に返信
> ようは"#dummy"でなければAttachEventHandlerを作成しないようにすればいいのかなと
「"#dummy"でなければAttachEventHandlerを作成しないようにすればいい」とはどういう意味なのでしょうか?
また、「"#dummy"」でなければとは、<a>タグのhrefが"#dummy"でなければということでしょうか?
それとも、WebBrowser1.Url.ToStringに"#dummy"がなければということでしょうか?
よろしくお願いします。
引用返信 編集キー/
■51783 / inTopicNo.4)  Re[3]: HtmlElementのAttachEventHandler
□投稿者/ やじゅ (1684回)-(2010/07/18(Sun) 14:50:15)
やじゅ さんの Web サイト
No51781 (ほっしゅ さん) に返信
> 「"#dummy"でなければAttachEventHandlerを作成しないようにすればいい」とはどういう意味なのでしょうか?

"#dummy"をクリックしたことで、DocumentCompletedイベントで、sender.Url.ToStringかe.Url.ToString の値が
変わるのであれば、その場合はAttachEventHandlerを作成しなければいいかなと思っただけで・・・試してないです。

引用返信 編集キー/
■51787 / inTopicNo.5)  Re[4]: HtmlElementのAttachEventHandler
□投稿者/ ほっしゅ (3回)-(2010/07/18(Sun) 17:03:33)
No51783 (やじゅ さん) に返信
> "#dummy"をクリックしたことで、DocumentCompletedイベントで、sender.Url.ToStringかe.Url.ToString の値が
> 変わるのであれば、その場合はAttachEventHandlerを作成しなければいいかなと思っただけで・・・試してないです。
でも、前のUrl.ToStringの値が"〜test.html#dummy"の場合、"#dummy"をクリックすると、次のDocumentCompletedイベントで得られる
Url.ToStringは同じなので、この場合はAttachEventHandlerを作成してはいけないのではないでしょうか?
むしろ逆で、Url.AbsolutePathが違う場合に、AttachEventHandlerを作成するようにすればいいのではないでしょうか?

ところで、次の疑問が残ります。
・今回、HtmlElementに対してAttachEventHandlerでイベントハンドラを設定していますが、
 設定したイベントハンドラを削除するDetachEventHandlerというメソッドがあるようです。
 これを使おうと思ったのですが、うまくイベントハンドラの削除ができていないようです。
 極端な話、HtmlElementに対してAttachEventHandler("onclick", AddressOf Test)を行った後、
 すぐにDetachEventHandler("onclick", AddressOf Test)を行っても、該当HtmlElementを
 クリックすると上記"Test"イベントハンドラが実行されます。
・<a href="#dummy">のように自身のアンカーへのリンクの場合でもWebBrowserのDocumentCompletedイベントが発生するのに、
 どうしてAttachEventHandlerで設定したイベントハンドラは解放されないのでしょうか?
 (それなのに、WebBrowserのRefreshを行ってリロードを行うと、AttachEventHandlerで設定したイベントハンドラは解放されますが
 WebBrowserのDocumentCompletedイベントは発生しません。)

よろしくお願いします。
引用返信 編集キー/
■51790 / inTopicNo.6)  Re[5]: HtmlElementのAttachEventHandler
□投稿者/ YAS (6回)-(2010/07/19(Mon) 00:05:58)
WebBrowserコントロールを使っているのなら,AttachEventHandlerを使うよりも普通にAddHandlerした方がよいのでは
ないでしょうか。
次のようにすれば問題ないように思います。

    Private Sub WebBrowser1_DocumentCompleted(ByVal sender As System.Object, ByVal e As System.Windows.Forms.WebBrowserDocumentCompletedEventArgs) Handles WebBrowser1.DocumentCompleted
        For Each atag As HtmlElement In WebBrowser1.Document.GetElementsByTagName("A")
            RemoveHandler atag.Click, AddressOf test
            AddHandler atag.Click, AddressOf test
        Next
    End Sub

    Private Sub test(ByVal sender As Object, ByVal e As EventArgs)

    End Sub

引用返信 編集キー/
■51791 / inTopicNo.7)  Re[6]: HtmlElementのAttachEventHandler
□投稿者/ ほっしゅ (4回)-(2010/07/19(Mon) 16:21:19)
No51790 (YAS さん) に返信
> WebBrowserコントロールを使っているのなら,AttachEventHandlerを使うよりも普通にAddHandlerした方がよいのでは
> ないでしょうか。
サンプルのようにしたら、うまくいきました。
ありがとうございました。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -