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

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

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

Re[10]: Confirmを強制的にOKにする方法がわかりません。


(過去ログ 116 を表示中)

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

■68038 / inTopicNo.1)  Confirmを強制的にOKにする方法がわかりません。
  
□投稿者/ ジョニー (1回)-(2013/09/18(Wed) 12:33:25)

分類:[C#] 

2013/09/18(Wed) 14:50:27 編集(投稿者)

初めましてジョニーと申します。

今回、Visual C# 2010を使用し、
webブラウザ(コントロール名:WebBrowser1)
を一つ貼り付けて、
クライアント側のプログラムを作成しています。

そこで下記のHTMLが書かれたページにアクセスして、
ボタンをクリックすると、

confirmが書かれているため、
画面上にメッセージボックスが必ず表示されます。

<div><input id="ID1" language="javascript" onclick="return confirm('これを適用します。よろしいですか?');" name="name1"

私のコードは以下の様に記述したところ、
ページのボタンは、問題なくクリック出来ました。

HtmlDocument doc;

doc = webBrowser1.Document;
HtmlElementCollection forms = doc.All.GetElementsByName("name1");
forms[0].InvokeMember("click");

ただ、この後に、confirmによって
出てくるメッセージボックス(【OK】と【キャンセル】を選択出来ます)
を出来れば、表示させずに【OK】ボタンを押したと
みなす処理を行いたいのですが、不可能だと思いますので、

このメッセージボックスが出た後に
ボタンが表示されますが、
出来れば、ユーザーに選ばせないで、
自動的に【OK】ボタンを押させたいのですが、
この様な事は、不可能なのでしょうか?

ただし、【OK】ボタンを押した後に処理があるので、
その処理は実行したいです。

もし、出来るのであれば、
その方法(サンプルコード)を記述して頂けばと思います。。

また、サンプルになるページがあれば教えてください。

どなたか、詳しい人で分かる方がいれば、
大変お手数をおかけしますが、是非、ご指導のほどお願いします。

よろしくお願いします。
引用返信 編集キー/
■68039 / inTopicNo.2)  Re[1]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ 魔界の仮面弁士 (347回)-(2013/09/18(Wed) 12:42:29)
No68038 (ジョニー さん) に返信
> ただ、この後に、confirmによって
> 出てくるメッセージボックス(【OK】と【キャンセル】を選択出来ます)
> を出来れば
> 出したくないのですが、不可能だと思いますので、

できますよ。IDocHostShowUI インターフェイスについて調べてみてください。

confirm が呼び出される直前に、IDocHostShowUI の ShowMessage メソッドが呼ばれます。
その ShowMessage の引数にて、メッセージボックスの内容を取得したり、
どのボタンが押されたことにするのか(あるいは標準のメッセー実装に任せるのか)を
指定することができます。
引用返信 編集キー/
■68040 / inTopicNo.3)  Re[2]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ 魔界の仮面弁士 (348回)-(2013/09/18(Wed) 12:56:18)
No68039 (魔界の仮面弁士) に追記
> できますよ。IDocHostShowUI インターフェイスについて調べてみてください。

少々古いサンプルですが、以前作ったものがあるので参考になれば。
http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=8274

ただし C#2010 ではなく、VB(.NET 2.0)向けに書いたサンプルです。


# ShowMessage の引数定義って、VB の MsgBox 関数(≠MessageBox.Show)に近いので、
# これに関しては、VB の方がサンプルを書きやすかったり…。
引用返信 編集キー/
■68041 / inTopicNo.4)  Re[3]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ ジョニー (2回)-(2013/09/18(Wed) 13:11:00)
No68040 (魔界の仮面弁士 さん) に返信
> ■No68039 (魔界の仮面弁士) に追記
>>できますよ。IDocHostShowUI インターフェイスについて調べてみてください。
>
> 少々古いサンプルですが、以前作ったものがあるので参考になれば。
> http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=8274
>
> ただし C#2010 ではなく、VB(.NET 2.0)向けに書いたサンプルです。
>
>
> # ShowMessage の引数定義って、VB の MsgBox 関数(≠MessageBox.Show)に近いので、
> # これに関しては、VB の方がサンプルを書きやすかったり…。

サンプルありがとうございます。

せっかくサンプルを出して頂きましたが、
初めてC#を使っていて、
VBが全く分からないため、
どの様に書き換えてよいのかが理解出来ません。

お手数をおかけ致しますが、
出来れば、c#用のサンプルを書いて頂けると
助かります。

IDocHostShowUI インターフェイスについても
今、調べていますが、
なかなか日本語で説明されていかるサイトが
あまりないので、参考になるサイトがあれば教えてください。

勝手な事ばかり言って申し訳ございません。
引用返信 編集キー/
■68042 / inTopicNo.5)  Re[1]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ WebSurfer (52回)-(2013/09/18(Wed) 13:16:57)
No68038 (ジョニー さん) に返信
> 2013/09/18(Wed) 12:44:20 編集(投稿者)
> このメッセージボックスが出た後に
> ボタンが表示されますが、
> 出来れば、ユーザーに選ばせないで、
> 自動的に【OK】ボタンを押させたいのですが、
> この様な事は、不可能なのでしょうか?

ebBrowser.DocumentComplete イベントのハンドラで id="ID1" の HtmlElement を
探して、onclick 属性を削除してしまう、即ち、その OuterHTML を

onclick="return confirm('これを適用します。よろしいですか?');"

のないものに書き換えてしまうということで可能ではないかと思います。(未検証です)
引用返信 編集キー/
■68043 / inTopicNo.6)  Re[4]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ PANG2 (4回)-(2013/09/18(Wed) 13:35:21)
onclickイベントを潰す

forms[0].SetAttribute("onclick", "");

またはconfirm関数を潰す

webBrowser1.Navigate("javascript:function confirm() {return true;}");

引用返信 編集キー/
■68044 / inTopicNo.7)  Re[2]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ ジョニー (3回)-(2013/09/18(Wed) 14:48:57)
No68042 (WebSurfer さん) に返信
> ■No68038 (ジョニー さん) に返信
>>2013/09/18(Wed) 12:44:20 編集(投稿者)
>>このメッセージボックスが出た後に
>>ボタンが表示されますが、
>>出来れば、ユーザーに選ばせないで、
>>自動的に【OK】ボタンを押させたいのですが、
>>この様な事は、不可能なのでしょうか?
>
> ebBrowser.DocumentComplete イベントのハンドラで id="ID1" の HtmlElement を
> 探して、onclick 属性を削除してしまう、即ち、その OuterHTML を
>
> onclick="return confirm('これを適用します。よろしいですか?');"
>
> のないものに書き換えてしまうということで可能ではないかと思います。(未検証です)

ただ、【OKボタン】を押した後の処理はして欲しいので、
別のものに書き換えて表示させなくするのは、
上手くないと思います。



引用返信 編集キー/
■68045 / inTopicNo.8)  Re[5]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ ジョニー (4回)-(2013/09/18(Wed) 14:51:16)
2013/09/18(Wed) 16:16:04 編集(投稿者)

No68043 (PANG2 さん) に返信
> onclickイベントを潰す
>
> forms[0].SetAttribute("onclick", "");
>
> またはconfirm関数を潰す
>
> webBrowser1.Navigate("javascript:function confirm() {return true;}");
>

PANG2さん
アドバイスありがとうございました。
下記ソースにて、解決出来ました。

doc = webBrowser1.Document;
HtmlElementCollection forms = doc.All.GetElementsByName("name1");
forms[0].SetAttribute("onclick", "");
forms[0].InvokeMember("click");


解決済み
引用返信 編集キー/
■68046 / inTopicNo.9)  Re[3]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ WebSurfer (53回)-(2013/09/18(Wed) 15:26:17)
No68044 (ジョニー さん) に返信
> ■No68042 (WebSurfer さん) に返信
>>■No68038 (ジョニー さん) に返信
> >>2013/09/18(Wed) 12:44:20 編集(投稿者)
> >>このメッセージボックスが出た後に
> >>ボタンが表示されますが、
> >>出来れば、ユーザーに選ばせないで、
> >>自動的に【OK】ボタンを押させたいのですが、
> >>この様な事は、不可能なのでしょうか?
>>
>>ebBrowser.DocumentComplete イベントのハンドラで id="ID1" の HtmlElement を
>>探して、onclick 属性を削除してしまう、即ち、その OuterHTML を
>>
>>onclick="return confirm('これを適用します。よろしいですか?');"
>>
>>のないものに書き換えてしまうということで可能ではないかと思います。未検証です)
>
> ただ、【OKボタン】を押した後の処理はして欲しいので、
> 別のものに書き換えて表示させなくするのは、
> 上手くないと思います。
>
全然仕組みが分かってないようですね。
confirm が出なくなるだけで、その後の処理は実行されますよ。


引用返信 編集キー/
■68047 / inTopicNo.10)  Re[4]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ ジョニー (6回)-(2013/09/18(Wed) 16:07:30)
2013/09/18(Wed) 16:11:38 編集(投稿者)
No68046 (WebSurfer さん) に返信
> ■No68044 (ジョニー さん) に返信
>>■No68042 (WebSurfer さん) に返信
> >>■No68038 (ジョニー さん) に返信
>>>>2013/09/18(Wed) 12:44:20 編集(投稿者)
>>>>このメッセージボックスが出た後に
>>>>ボタンが表示されますが、
>>>>出来れば、ユーザーに選ばせないで、
>>>>自動的に【OK】ボタンを押させたいのですが、
>>>>この様な事は、不可能なのでしょうか?
> >>
> >>ebBrowser.DocumentComplete イベントのハンドラで id="ID1" の HtmlElement を
> >>探して、onclick 属性を削除してしまう、即ち、その OuterHTML を
> >>
> >>onclick="return confirm('これを適用します。よろしいですか?');"
> >>
> >>のないものに書き換えてしまうということで可能ではないかと思います。未検証です)
>>
>>ただ、【OKボタン】を押した後の処理はして欲しいので、
>>別のものに書き換えて表示させなくするのは、
>>上手くないと思います。
>>
> 全然仕組みが分かってないようですね。
> confirm が出なくなるだけで、その後の処理は実行されますよ。
>
>

replaceすると言う事ですか?
以下の様に書いてみましたが、
何も処理されずに終わりました。

根本的に分かっていないのでしょうか?

HtmlElementCollection buttons = webBrowser1.Document.GetElementsByTagName("input");//タグ指定
foreach (HtmlElement element in buttons)
{
if (element.GetAttribute("name").IndexOf("name1") >= 0)
{
element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
element.InvokeMember("click");
}
}
引用返信 編集キー/
■68048 / inTopicNo.11)  Re[5]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ ジョニー (7回)-(2013/09/18(Wed) 16:27:10)
No68047 (ジョニー さん) に返信
> 2013/09/18(Wed) 16:11:38 編集(投稿者)
> ■No68046 (WebSurfer さん) に返信
>>■No68044 (ジョニー さん) に返信
> >>■No68042 (WebSurfer さん) に返信
>>>>■No68038 (ジョニー さん) に返信
> >>>>2013/09/18(Wed) 12:44:20 編集(投稿者)
> >>>>このメッセージボックスが出た後に
> >>>>ボタンが表示されますが、
> >>>>出来れば、ユーザーに選ばせないで、
> >>>>自動的に【OK】ボタンを押させたいのですが、
> >>>>この様な事は、不可能なのでしょうか?
>>>>
>>>>ebBrowser.DocumentComplete イベントのハンドラで id="ID1" の HtmlElement を
>>>>探して、onclick 属性を削除してしまう、即ち、その OuterHTML を
>>>>
>>>>onclick="return confirm('これを適用します。よろしいですか?');"
>>>>
>>>>のないものに書き換えてしまうということで可能ではないかと思います。未検証です)
> >>
> >>ただ、【OKボタン】を押した後の処理はして欲しいので、
> >>別のものに書き換えて表示させなくするのは、
> >>上手くないと思います。
> >>
>>全然仕組みが分かってないようですね。
>>confirm が出なくなるだけで、その後の処理は実行されますよ。
>>
>>
>
> replaceすると言う事ですか?
> 以下の様に書いてみましたが、
> 何も処理されずに終わりました。
>
> 根本的に分かっていないのでしょうか?
>
> HtmlElementCollection buttons = webBrowser1.Document.GetElementsByTagName("input");//タグ指定
> foreach (HtmlElement element in buttons)
> {
> if (element.GetAttribute("name").IndexOf("name1") >= 0)
> {
> element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
> element.InvokeMember("click");
> }
> }


PANG2さんのアドバイスにより解決出来ました。

下記ソースで対応出来ました。

doc = webBrowser1.Document;
HtmlElementCollection forms = doc.All.GetElementsByName("name1");
forms[0].SetAttribute("onclick", "");
forms[0].InvokeMember("click");
引用返信 編集キー/
■68051 / inTopicNo.12)  Re[5]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ WebSurfer (54回)-(2013/09/19(Thu) 09:37:32)
No68047 (ジョニー さん) に返信
> 2013/09/18(Wed) 16:11:38 編集(投稿者)
> replaceすると言う事ですか?
> 以下の様に書いてみましたが、
> 何も処理されずに終わりました。
>
> 根本的に分かっていないのでしょうか?
>
> HtmlElementCollection buttons = webBrowser1.Document.GetElementsByTagName("input");//タグ指定
> foreach (HtmlElement element in buttons)
> {
> if (element.GetAttribute("name").IndexOf("name1") >= 0)
> {
> element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
> element.InvokeMember("click");
> }
> }


forms[0].SetAttribute("onclick", "");

で解決できたそうですが、上記コードの forms[0] (<input id="ID1" ... /> 要素)
と同じ HtmlElelement オブジェクトと同じものが、

element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");

上記コードの element で取得できていれば、結果は同じになるはずです。

デバッガで確認してみましたか?


なお、String.Replace を使うより、以下のように直接 html コードの文字列を代入す
るほうが確実だと思います。

element.OuterHtml = "<input id=\"ID1\" ... />";

引用返信 編集キー/
■68054 / inTopicNo.13)  Re[6]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ PANG2 (5回)-(2013/09/19(Thu) 11:09:12)
No68051 (WebSurfer さん) に返信
> ■No68047 (ジョニー さん) に返信
>>2013/09/18(Wed) 16:11:38 編集(投稿者)
>>replaceすると言う事ですか?
>>以下の様に書いてみましたが、
>>何も処理されずに終わりました。
>>
>>根本的に分かっていないのでしょうか?
>>
>>HtmlElementCollection buttons = webBrowser1.Document.GetElementsByTagName("input");//タグ指定
>>foreach (HtmlElement element in buttons)
>>{
>> if (element.GetAttribute("name").IndexOf("name1") >= 0)
>> {
>> element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
>> element.InvokeMember("click");
>> }
>>}
>
>
> forms[0].SetAttribute("onclick", "");
>
> で解決できたそうですが、上記コードの forms[0] (<input id="ID1" ... /> 要素)
> と同じ HtmlElelement オブジェクトと同じものが、
>
> element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
>
> 上記コードの element で取得できていれば、結果は同じになるはずです。
>
> デバッガで確認してみましたか?

WebSurferさんは確認されたのでしょうか?
引用返信 編集キー/
■68056 / inTopicNo.14)  Re[7]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ WebSurfer (55回)-(2013/09/19(Thu) 12:49:13)
No68054 (PANG2 さん) に返信
> ■No68051 (WebSurfer さん) に返信
>>■No68047 (ジョニー さん) に返信
> >>2013/09/18(Wed) 16:11:38 編集(投稿者)
> >>replaceすると言う事ですか?
> >>以下の様に書いてみましたが、
> >>何も処理されずに終わりました。
> >>
> >>根本的に分かっていないのでしょうか?
> >>
> >>HtmlElementCollection buttons = webBrowser1.Document.GetElementsByTagName("input");//タグ指定
> >>foreach (HtmlElement element in buttons)
> >>{
> >> if (element.GetAttribute("name").IndexOf("name1") >= 0)
> >> {
> >> element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
> >> element.InvokeMember("click");
> >> }
> >>}
>>
>>
>>forms[0].SetAttribute("onclick", "");
>>
>>で解決できたそうですが、上記コードの forms[0] (<input id="ID1" ... /> 要素)
>>と同じ HtmlElelement オブジェクトと同じものが、
>>
>>element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
>>
>>上記コードの element で取得できていれば、結果は同じになるはずです。
>>
>>デバッガで確認してみましたか?
>
> WebSurferさんは確認されたのでしょうか?

以下のような形では昔作ったコードで書き換えられることは確認してます。

element.OuterHtml = "<input id=\"ID1\" ... />";

引用返信 編集キー/
■68059 / inTopicNo.15)  Re[8]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ PANG2 (6回)-(2013/09/19(Thu) 15:07:46)
> element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
> element.InvokeMember("click");

element.OuterHtml の値が変わらないのが不思議なので、調べてみました。

結論

element.OuterHtml に代入したとき、ブラウザ側では書き換えられているが、element変数の参照が無効になる。
elementのインスタンスを再取得する必要がある。

実験コード

private void button1_Click(object sender, EventArgs e)
{
HtmlElement element = webBrowser1.Document.All.GetElementsByName("name1")[0];
element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
element.InvokeMember("click"); // elementの参照が無効なので何も動作しない
}

private void button2_Click(object sender, EventArgs e)
{
HtmlElement element = webBrowser1.Document.All.GetElementsByName("name1")[0];
element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
element = webBrowser1.Document.All.GetElementsByName("name1")[0]; //インスタンスを再取得
element.InvokeMember("click");
}

参考

HtmlElement.OuterHtml Property
http://msdn.microsoft.com/ja-jp/library/system.windows.forms.htmlelement.outerhtml(v=vs.80).aspx

> If you assign a new value to OuterHtml, the current element reference will become invalid;
> it will not reflect the name, properties and child content of the HTML you have just assigned.

引用返信 編集キー/
■68064 / inTopicNo.16)  Re[9]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ WebSurfer (56回)-(2013/09/20(Fri) 08:12:43)
No68059 (PANG2 さん) に返信
>>element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
>>element.InvokeMember("click");
>
> element.OuterHtml の値が変わらないのが不思議なので、調べてみました。
>
> 結論
>
> element.OuterHtml に代入したとき、ブラウザ側では書き換えられているが、element変数の参照が無効になる。
> elementのインスタンスを再取得する必要がある。

フォローありがとうございました。
引用返信 編集キー/
■68088 / inTopicNo.17)  Re[10]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ ジョニー (8回)-(2013/09/22(Sun) 01:39:34)
No68064 (WebSurfer さん) に返信
> ■No68059 (PANG2 さん) に返信
> >>element.OuterHtml = element.OuterHtml.Replace("return confirm('これを適用します。よろしいですか?');", "");
> >>element.InvokeMember("click");
>>
>>element.OuterHtml の値が変わらないのが不思議なので、調べてみました。
>>
>>結論
>>
>>element.OuterHtml に代入したとき、ブラウザ側では書き換えられているが、element変数の参照が無効になる。
>>elementのインスタンスを再取得する必要がある。
>
> フォローありがとうございました。

WebSurferさん
PANG2さん

本当にありがとうございました。

大変、勉強になりました。
引用返信 編集キー/
■68275 / inTopicNo.18)  Re[4]: Confirmを強制的にOKにする方法がわかりません。
□投稿者/ 魔界の仮面弁士 (363回)-(2013/10/04(Fri) 23:53:29)
2013/10/18(Fri) 14:39:49 編集(投稿者)

No68041 (ジョニー さん) に返信
>>>できますよ。IDocHostShowUI インターフェイスについて調べてみてください。
>>少々古いサンプルですが、以前作ったものがあるので参考になれば。
>>http://hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?mode=allread&no=8274
>>ただし C#2010 ではなく、VB(.NET 2.0)向けに書いたサンプルです。
> 出来れば、c#用のサンプルを書いて頂けると
> 助かります。

C#2010 向けに書き起こしてみました。
http://www.vb-user.net/junk/replySamples/2013.10.04.23.50/WebBrowserMessageSample.zip


もう見ておられないかも知れませんが、まだ「解決済み」は付いていないようなので…。


-- 追記 --
未解決かと思ったら、#68045 で解決済みが付いていたものを、
WebSurfer さんが #68046 で解除されていたのですね…。

外したままにしておくべきなのかどうか悩みましたが、元質問者的には
既に終わった話題のようなので、[解決済み]を復元しておきます。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -