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

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

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

Re[2]: WebBrowser上のbuttonイベントを拾いたい


(過去ログ 116 を表示中)

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

■68406 / inTopicNo.1)  WebBrowser上のbuttonイベントを拾いたい
  
□投稿者/ joker (1回)-(2013/10/18(Fri) 20:43:08)

分類:[C#] 

http://bbs.wankuma.com/index.cgi?mode=al2&namber=46863&KLOG=79
のページでVBで書かれていたサンプルと
先ほどのサトウさんのサンプルで書かれていたのを参考にすると



webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", Function() MessageBox.Show("押された!"))

と書きたいところですが、Function()はC#にはありません。
ここはC#でどう書けばよいのですか?


先ほどのは
webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onblur", delegate { MessageBox.Show("フォーカスが離れました"); });
と書かれていたので、



同じように
webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", delegate { MessageBox.Show(押された!"); });
と書いてみたところ上手くいきませんでした。

delegateの意味が難しくて分かりませんでした。

引用返信 編集キー/
■68407 / inTopicNo.2)  Re[1]: WebBrowser上のbuttonイベントを拾いたい
□投稿者/ 魔界の仮面弁士 (384回)-(2013/10/18(Fri) 22:34:41)
2013/10/18(Fri) 22:45:44 編集(投稿者)

No68406 (joker さん) に返信
> と書いてみたところ上手くいきませんでした。
コード自体は合っているように見えます。

Web ページの読み込みが完了する前に割り当てている、ということはありませんか?
(DocumentCompleted が発生する前に割り当てているとか)

もしくは、AttachEventHandler 後に別のページに遷移していたりはしないでしょうか。
ドキュメントが読み直された場合は、再度イベントの割り当てが必要です。

(Visual Studio が使えない場所に居るため、検証せずに回答しています。間違っていたらどなたかフォロー願います。)


> webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", delegate { MessageBox.Show(押された!"); });
「"」が一個抜けているのは目を瞑るとして、これは匿名メソッドですね。記述自体は正しいと思います。

上記は引数を省略した構文であり、省略しない場合には、
 webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", delegate(object o, EventArgs a) { MessageBox.Show("押された!"); });
あるいは
 webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", new EventHandler(delegate(object o, EventArgs a) { MessageBox.Show("押された!"); }));
などと書きます。

ちなみに VB には匿名メソッドが存在しないため、上記に対応する VB 構文はありません。
(VB2005 以下で無いのなら、ラムダ式で代用できますけれどね)


> webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", Function() MessageBox.Show("押された!"))
この場合の Function は「単一行ラムダ式」ですね。VB2010 以降では、Function() の代わりに Sub() も使えます。

手元に環境が無いので確認できませんが、C# 構文に訳すのであれば、
 webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", (object o, EventArgs a) => MessageBox.Show("押された!"));
になると思います。ただし VB のように、引数を省略した
 webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", () => MessageBox.Show("押された!"));
といった書き方はできなかったはずです(引数定義が異なるのでエラーになるはず)。
引数を省略したい場合には、ラムダ式やデリゲートインスタンスでは無く、匿名メソッドを使えば OK です。


> delegateの意味が難しくて分かりませんでした。
いわゆる「イベント」の割り当てを行う際にもデリゲートを渡しますよね。構文的には、「+=」で代入するかどうかの違いだけです。
引用返信 編集キー/
■68408 / inTopicNo.3)  Re[2]: WebBrowser上のbuttonイベントを拾いたい
□投稿者/ joker (2回)-(2013/10/18(Fri) 23:00:07)
No68407 (魔界の仮面弁士 さん) に返信
> 2013/10/18(Fri) 22:45:44 編集(投稿者)
>
> ■No68406 (joker さん) に返信
>>と書いてみたところ上手くいきませんでした。
> コード自体は合っているように見えます。
>
> Web ページの読み込みが完了する前に割り当てている、ということはありませんか?
> (DocumentCompleted が発生する前に割り当てているとか)
>
> もしくは、AttachEventHandler 後に別のページに遷移していたりはしないでしょうか。
> ドキュメントが読み直された場合は、再度イベントの割り当てが必要です。
>
> (Visual Studio が使えない場所に居るため、検証せずに回答しています。間違っていたらどなたかフォロー願います。)
>
>
>>webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", delegate { MessageBox.Show(押された!"); });
> 「"」が一個抜けているのは目を瞑るとして、これは匿名メソッドですね。記述自体は正しいと思います。
>
> 上記は引数を省略した構文であり、省略しない場合には、
>  webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", delegate(object o, EventArgs a) { MessageBox.Show("押された!"); });
> あるいは
>  webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", new EventHandler(delegate(object o, EventArgs a) { MessageBox.Show("押された!"); }));
> などと書きます。
>
> ちなみに VB には匿名メソッドが存在しないため、上記に対応する VB 構文はありません。
> (VB2005 以下で無いのなら、ラムダ式で代用できますけれどね)
>
>
>>webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", Function() MessageBox.Show("押された!"))
> この場合の Function は「単一行ラムダ式」ですね。VB2010 以降では、Function() の代わりに Sub() も使えます。
>
> 手元に環境が無いので確認できませんが、C# 構文に訳すのであれば、
>  webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", (object o, EventArgs a) => MessageBox.Show("押された!"));
> になると思います。ただし VB のように、引数を省略した
>  webBrowser1.Document.GetElementById("idの値").AttachEventHandler("onclick", () => MessageBox.Show("押された!"));
> といった書き方はできなかったはずです(引数定義が異なるのでエラーになるはず)。
> 引数を省略したい場合には、ラムダ式やデリゲートインスタンスでは無く、匿名メソッドを使えば OK です。
>
>
>>delegateの意味が難しくて分かりませんでした。
> いわゆる「イベント」の割り当てを行う際にもデリゲートを渡しますよね。構文的には、「+=」で代入するかどうかの違いだけです。

凄いわかりやすくて詳しい回答ありがとうございます。

問題なかったようです、どうやらIDの値を間違えていました。^^;

大変助かりました。

解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -