2017-02-10 8 views
0

WebBrowserユーザーコントロールを含むwinformsアプリケーションの作成に取り組んでいます。 WebBrowserコントロールは、ユーザー認証の詳細を要求するWebアプリケーション内のページに移動します。ユーザ名とパスワードが入力され、フォームが送信されると、Webアプリケーションは要求を送信し、認証が成功した場合は変数をapplicationValuesオブジェクトに設定します。WebアプリケーションのオブジェクトをWinFormsアプリケーションのWebBrowserコントロールで読み取る

applicationValuesオブジェクトがインスタンス化されるとき、WebBrowserコントロールのWebアプリケーションからそのオブジェクトをWinformsアプリケーションに読み込み、WebBrowserコントロールを含むフォームを閉じます。

現在、これは動作しています(オブジェクトはWebアプリケーションで正常に作成されます)。これは、applicationValuesオブジェクトをWinformsアプリケーションに戻す必要がある部分です。そこに私は立ち往生している。

これをこのコントロールで行うことはできますか?そうでない場合は、私が検討すべき他のアプローチや回避策がありますか?

答えて

1

これはできますが、あなたの一部でいくつかの作業が必要になります。まず、Webブラウザコントロールとその中にあるページ間でデータをやりとりする最も簡単な方法は、window.externalとinvokeスクリプトです。もちろん、あなたのユーザーコントロールにobjectforscripting属性を設定する必要があります。

これを済ませたら、プリミティブ型を介してjavacriptから.netへ2通りのデータを自由に送ることができます。具体的には、JSON文字列にシリアル化してからwindow.externalを介して送信し、.NET側の相手オブジェクトに逆シリアル化しておくとよいでしょう。あなたはSystem.Web.Script.SerializationのJavaScriptSerializerを使うことができます。もちろん、JSON.netをdeserializeに使うこともできます。ここで

MSDN

private void Form1_Load(object sender, EventArgs e) 
{ 

    webBrowser1.ObjectForScripting = this; 

    webBrowser1.DocumentText = 
     "<html><head><script>" + 
     "function test(message) { alert(message); }" + 
     "</script></head><body><button " + 
     "onclick=\"window.external.Test('called from script code')\">" + 
     "call client code from script code</button>" + 
     "</body></html>"; 
} 

public void Test(String message) 
{ 
    MessageBox.Show(message, "client code"); 
} 

private void button1_Click(object sender, EventArgs e) 
{ 
    webBrowser1.Document.InvokeScript("test", 
     new String[] { "called from client code" }); 
} 
から取られた基本的な考え方である
関連する問題