2017-09-09 3 views
0

Webブラウザコントロールを持つC#winformプロジェクトがあります。私はWebブラウザに画像を持つHTMLページをロードしています。NET webbrowser - 画像をクリックしてHTML要素IDを取得

<img src="F:\Temp\file12948.jpg" id="12948" width="180px"> 

私は私のコードでIDを使用することができますので、画像をクリックしたときに変数にIDを渡す方法があります:各画像が異なるIDを持っていますか?私はそこから番号を抽出できるので、画像へのパスを使うこともできます。

私は既にここで、どこでも解決策を探していますが、関連するものは何も見つかりません。

+0

ページで任意のJavaScriptコードの可能性のある重複したくない場合は、[ネットウェブブラウザでクリックされた要素のIDを取得する方法](https://stackoverflow.com/q/41293979/11683)。 jsavascriptのクリックハンドラがうまくいけば、[WinForms - WebBrowserコントロールの中からC#アプリケーションコードを実行するにはどうすればいいですか?](https://stackoverflow.com/q/305915/11683)の重複が考えられます。 – GSerg

+0

ありがとう、すでに見て、最初のものをテスト。それは私が探しているものであるマウスの左ボタンではなく、Webブラウザのコンテキストメニューを使用する必要があるようです。 – Rado

+0

他に何も動作しない場合、JavaScriptのことがあります。ユーザーがIEでjavascriptを無効にしている可能性がある以外の欠点がありますか? – Rado

答えて

2

あなたが動的に画像ののonClickイベントにアタッチすることができます。

public class TestForm : Form 
{ 
    WebBrowser _WebBrowser = null; 
    public TestForm() 
    { 
     _WebBrowser = new WebBrowser(); 
     _WebBrowser.ScriptErrorsSuppressed = true; 
     _WebBrowser.Dock = DockStyle.Fill; 
     this.Controls.Add(_WebBrowser); 

     WebBrowserDocumentCompletedEventHandler Completed = null; 

     Completed = (s, e) => 
     { 
      //add onclick event dynamically 
      foreach (var img in _WebBrowser.Document.GetElementsByTagName("img").OfType<HtmlElement>()) 
      { 
       img.AttachEventHandler("onclick", (_, __) => OnClick(img)); 
      } 

      _WebBrowser.DocumentCompleted -= Completed; 
     }; 

     _WebBrowser.DocumentCompleted += Completed; 

     var imgurl = "https://www.google.com/images/branding/googlelogo/2x/googlelogo_color_120x44dp.png"; 
     //_WebBrowser.Navigate("http://edition.cnn.com/2017/09/09/us/hurricane-irma-cuba-florida/index.html"); 
     _WebBrowser.DocumentText = $"<html> <img src='{imgurl}' id=123 /> </html>"; 
    } 

    void OnClick(HtmlElement img) 
    { 
     MessageBox.Show(img.GetAttribute("id")); 
    } 
} 
+1

これはまさに私が望むものです。優秀、ありがとう! – Rado

1

簡単な方法では、ブラウザのナビゲーションを使用することです。クリックすると、特別なURLにナビゲートできます。次に、Navigatingイベントを処理し、URLが特別なURLであれば、ナビゲーションをキャンセルしてデータを処理します。

public MainWindow() 
{ 
    InitializeComponent(); 
    br.NavigateToString(@"<a href=""http://messages?id=12948""><img src=""F:\Temp\file12948.jpg"" id=""12948"" width=""180px"" ></a>"); 
    br.Navigating += this.Br_Navigating; 
} 

private void Br_Navigating(object sender, NavigatingCancelEventArgs e) 
{ 
    if(e.Uri.Host == "messages") 
    { 
     MessageBox.Show(e.Uri.Query); 
     e.Cancel = true; 
    } 
} 

これは、HTMLを何らかの形で管理している場合に機能します。アンカーを追加しない場合は、JSからURLを設定することもできます。

編集

上記バージョンは、WPFアプリケーションのためのものです。リサイズバージョンは次のとおりです。

public Form1() 
{ 
    InitializeComponent(); 
    webBrowser1.DocumentText = @"<a href=""http://messages?id=12948""><img src=""F:\Temp\file12948.jpg"" id=""12948"" width=""180px"" ></a>"; 
    webBrowser1.Navigating += this.webBrowser1_Navigating; 

} 

private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e) 
{ 
    if (e.Url.Host == "messages") 
    { 
     MessageBox.Show(e.Url.Query); 
     e.Cancel = true; 
    } 
} 
+0

それはデータベースプロジェクトの一部です。すべてのデータはローカルです。私は同様のことを考えていました.IEを開く代わりに別のWebブラウザインスタンスに移動してから、そこからUriを取得します。 – Rado

+0

あなたはウェブブラウザコントロールを使用していたことを理解していました。その場合、ナビゲーションは同じインスタンスで行われます。ナビゲーションをキャンセルすると、ユーザはナビゲーションに気付かないでしょう。 –

+0

これはうまくいくかもしれません。 – Rado

関連する問題