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

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

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

Re[2]: WEB上のコンボボックスを選択する方法がわからない。


(過去ログ 116 を表示中)

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

■68218 / inTopicNo.1)  WEB上のコンボボックスを選択する方法がわからない。
  
□投稿者/ ジョニー (17回)-(2013/10/01(Tue) 21:02:27)

分類:[C#] 

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

そこで下記のHTMLが書かれたページにアクセスして、
web上のコンボボックスを変更したいのですが、
value="0"の値が複数あるので、この場合にvalue="0"の【さくらんぼ】を選択させるには
どの様に記述すれば良いのでしょうか?

value="0"の3番目とかいう記述は可能なのでしょうか?

ちなみに【みかん】だと
doc.Body.All.GetElementsByName("fruits")[0].SetAttribute("value", "1353");
で行きますが、

【さくらんぼ】の場合
doc.Body.All.GetElementsByName("fruits")[0].SetAttribute("value", "0");
では上手く行きませんでした。

HTML文
<select name="fruits" size="1" id="fruits" class="fs12" style="float:left;">
<option value="0">りんご</option>
<option value="1353">みかん</option>
<option value="1002">なし</option>
<option value="1092">パイナップル</option>
<option value="1094">キウイ</option>
<option value="0">バナナ</option>
<option value="1192">マンゴー</option>
<option value="1194">いちご</option>
<option value="1195">柿</option>
<option value="1196">桃</option>
<option value="0">さくらんぼ</option>
引用返信 編集キー/
■68219 / inTopicNo.2)  Re[1]: WEB上のコンボボックスを選択する方法がわからない。
□投稿者/ 魔界の仮面弁士 (357回)-(2013/10/01(Tue) 21:48:39)
No68218 (ジョニー さん) に返信
> そこで下記のHTMLが書かれたページにアクセスして、
id 属性があるので、doc.Body.All.GetElementsByName("fruits") よりも、
doc.GetElementById("fruits") の方が良いかと。


> この場合にvalue="0"の【さくらんぼ】を選択させるには
項目位置が 10 個目なので、
 webBrowser1.Document.GetElementById("fruits").SetAttribute("selectedIndex", "10");
とか。


検索するなら、たとえばこんな感じ。


// 案1
dynamic fruits = webBrowser1.Document.GetElementById("fruits").DomElement;
foreach (var opt in fruits.options)
{
 if (opt.value == "0" && opt.text == "さくらんぼ")
 {
  fruits.selectedIndex = opt.index;
  break;
 }
}



// 案2
var fruits = webBrowser1.Document.GetElementById("fruits");
var index = fruits.Children.OfType<HtmlElement>()
  .Where(tag => tag.TagName == "OPTION") // TagName は常に大文字を返す
  .Select((tag, i) => new
  {
    i,
    value = tag.GetAttribute("value"),
    text = tag.InnerText
  })
  .Where(x => x.value == "0" && x.text == "さくらんぼ")
  .Select(x => x.i).DefaultIfEmpty(-1).FirstOrDefault();
fruits.SetAttribute("selectedIndex", index.ToString());
引用返信 編集キー/
■68220 / inTopicNo.3)  Re[2]: WEB上のコンボボックスを選択する方法がわからない。
□投稿者/ 魔界の仮面弁士 (358回)-(2013/10/01(Tue) 22:03:28)
No68219 (魔界の仮面弁士) に追記
> // 案2
> var fruits = webBrowser1.Document.GetElementById("fruits");
> var index = fruits.Children.OfType<HtmlElement>()
>   .Where(tag => tag.TagName == "OPTION") // TagName は常に大文字を返す

第1案(アンマネージオブジェクト版)の方はともかくとして、
第2案(マネージオブジェクト + LINQ 版)の方は、念のため
fruits.Children ではなく fruits.All にした方が良いかも。

『var index = fruits.Children.OfType<HtmlElement>().Where(…』


下記のような構造(optGroup)が現れた場合の対策という事で:


<select name="fruits" size="1" id="fruits" class="fs12" style="float:left;">
<optgroup label="グループ1">
<option value="1">項目1</option>
<option value="2">項目2</option>
<option value="3">項目3</option>
</optgroup>
<optgroup label="グループ2">
<option value="4">項目4</option>
<option value="5">項目5</option>
</optgroup>
引用返信 編集キー/
■68221 / inTopicNo.4)  Re[2]: WEB上のコンボボックスを選択する方法がわからない。
□投稿者/ ジョニー (18回)-(2013/10/01(Tue) 22:06:26)
2013/10/01(Tue) 22:07:32 編集(投稿者)

No68219 (魔界の仮面弁士 さん) に返信
> ■No68218 (ジョニー さん) に返信
>>そこで下記のHTMLが書かれたページにアクセスして、
> id 属性があるので、doc.Body.All.GetElementsByName("fruits") よりも、
> doc.GetElementById("fruits") の方が良いかと。
>
>
>>この場合にvalue="0"の【さくらんぼ】を選択させるには
> 項目位置が 10 個目なので、
>  webBrowser1.Document.GetElementById("fruits").SetAttribute("selectedIndex", "10");
> とか。
>
>
> 検索するなら、たとえばこんな感じ。
>
>
> // 案1
> dynamic fruits = webBrowser1.Document.GetElementById("fruits").DomElement;
> foreach (var opt in fruits.options)
> {
>  if (opt.value == "0" && opt.text == "さくらんぼ")
>  {
>   fruits.selectedIndex = opt.index;
>   break;
>  }
> }
>
>
>
> // 案2
> var fruits = webBrowser1.Document.GetElementById("fruits");
> var index = fruits.Children.OfType<HtmlElement>()
>   .Where(tag => tag.TagName == "OPTION") // TagName は常に大文字を返す
>   .Select((tag, i) => new
>   {
>     i,
>     value = tag.GetAttribute("value"),
>     text = tag.InnerText
>   })
>   .Where(x => x.value == "0" && x.text == "さくらんぼ")
>   .Select(x => x.i).DefaultIfEmpty(-1).FirstOrDefault();
> fruits.SetAttribute("selectedIndex", index.ToString());

案1で解決出来ました。

魔界の仮面弁士さん
色々なアドバイスをして頂き、
ありがとうございました。

大変勉強になりました。



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


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

このトピックに書きこむ

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

管理者用

- Child Tree -