Javascript 单击DotNetBrowser中的html按钮后打开第二个windows窗体

Javascript 单击DotNetBrowser中的html按钮后打开第二个windows窗体,javascript,c#,dotnetbrowser,Javascript,C#,Dotnetbrowser,我试图打开一个带有DotNetBrowser控件的windows窗体,具体的html控件如下代码所示 单击html上的按钮后,我需要隐藏加载的表单,然后显示第二个windows表单 我使用的c#代码如下: public partial class Form1 : Form { private Browser browser; public Form1() { InitializeComponent(); browser = BrowserF

我试图打开一个带有DotNetBrowser控件的windows窗体,具体的html控件如下代码所示

单击html上的按钮后,我需要隐藏加载的表单,然后显示第二个windows表单

我使用的c#代码如下:

public partial class Form1 : Form
{
    private Browser browser;
    public Form1()
    {
        InitializeComponent();
        browser = BrowserFactory.Create();
        browser.FinishLoadingFrameEvent += delegate(object sender, FinishLoadingEventArgs e)
        {
            if (e.IsMainFrame)
            {
                JSValue value = browser.ExecuteJavaScriptAndReturnValue("window");
                value.AsObject().SetProperty("Account", new Form1());
            }
        };

        browser.LoadHTML(@"<!DOCTYPE html>
                                <html>
                                <head>
                                    <script type='text/javascript'>
                                          function sendFormData() {
                                            var firstNameValue = myForm.elements['firstName'].value;
                                            var lastNameValue = myForm.elements['lastName'].value;
                                            // Invoke the 'save' method of the 'Account' Java object.
                                            Account.Save(firstNameValue, lastNameValue);
                                          }
                                        </script>
                                </head>
                                <body>
                                <form name='myForm'>
                                    First name: <input type='text' name='firstName'/>
                                    <br/>
                                    Last name: <input type='text' name='lastName'/>
                                    <br/>
                                    <input type='button' value='Save' onclick='sendFormData();'/>
                                </form>
                                </body>
                                </html>");


        BrowserView browserView = new WinFormsBrowserView(browser);
        this.Controls.Add((Control)browserView.GetComponent());
    }

    public void Save(String firstName, String lastName)
    {
        string _firstname = firstName;            

        this.Hide();
        SecondForm frm = new SecondForm(firstName);
        frm.ShowDialog();

    }
公共部分类表单1:表单
{
专用浏览器;
公共表格1()
{
初始化组件();
browser=BrowserFactory.Create();
browser.FinishLoadingFrameEvent+=委托(对象发送者,FinishLoadingEventArgs e)
{
if(e.IsMainFrame)
{
JSValue=browser.executejavascriptanderturnvalue(“窗口”);
value.AsObject().SetProperty(“帐户”,新表单1());
}
};
browser.LoadHTML(@)
函数sendFormData(){
var firstNameValue=myForm.elements['firstName'].value;
var lastName value=myForm.elements['lastName'].value;
//调用“Account”Java对象的“save”方法。
Account.Save(firstNameValue、lastNameValue);
}
名字:

姓氏:
"); BrowserView BrowserView=新的WinFormsBrowserView(浏览器); this.Controls.Add((Control)browserView.GetComponent()); } public void Save(String firstName、String lastName) { 字符串_firstname=firstname; this.Hide(); SecondForm frm=新的SecondForm(名字); frm.ShowDialog(); }
问题是,第一个表单(包含浏览器控件)没有隐藏并仍保持焦点


任何帮助都将不胜感激。

要对DotNetBrowser事件执行任何与UI相关的操作,必须将执行传递给主UI线程。在其他情况下,某些方法将引发跨线程操作异常,甚至在没有任何消息的情况下失败

要从JavaScript隐藏.NET回调中的表单,需要将对其隐藏方法的调用包装到BeginInvoke()中。修改后的示例代码如下所示:

public partial class Form1 : Form
{
    private Browser browser;
    public Form1()
    {
        InitializeComponent();
        browser = BrowserFactory.Create();
        browser.FinishLoadingFrameEvent += delegate (object sender, FinishLoadingEventArgs e)
        {
            if (e.IsMainFrame)
            {
                JSValue value = browser.ExecuteJavaScriptAndReturnValue("window");
                value.AsObject().SetProperty("Account", new Account(this));
            }
        };
        browser.LoadHTML(@"<!DOCTYPE html>
                            <html>
                            <head>
                                <script type='text/javascript'>
                                        function sendFormData() {
                                        var firstNameValue = myForm.elements['firstName'].value;
                                        var lastNameValue = myForm.elements['lastName'].value;
                                        // Invoke the 'save' method of the 'Account' Java object.
                                        Account.Save(firstNameValue, lastNameValue);
                                        }
                                    </script>
                            </head>
                            <body>
                            <form name='myForm'>
                                First name: <input type='text' name='firstName'/>
                                <br/>
                                Last name: <input type='text' name='lastName'/>
                                <br/>
                                <input type='button' value='Save' onclick='sendFormData();'/>
                            </form>
                            </body>
                            </html>");
        BrowserView browserView = new WinFormsBrowserView(browser);
        this.Controls.Add((Control)browserView.GetComponent());
    }
    public class Account
    {
        private Form Form;
        public Account(Form form)
        {
            this.Form = form;
        }
        public void Save(String firstName, String lastName)
        {
            string _firstname = firstName;
            Form.Invoke(new Action(() =>
            {
                Form.Hide();
            }));
            SecondForm frm = new SecondForm(firstName);
            frm.ShowDialog(); 
        }
    }
}
公共部分类表单1:表单
{
专用浏览器;
公共表格1()
{
初始化组件();
browser=BrowserFactory.Create();
browser.FinishLoadingFrameEvent+=委托(对象发送者,FinishLoadingEventArgs e)
{
if(e.IsMainFrame)
{
JSValue=browser.executejavascriptanderturnvalue(“窗口”);
value.AsObject().SetProperty(“帐户”,新帐户(此));
}
};
browser.LoadHTML(@)
函数sendFormData(){
var firstNameValue=myForm.elements['firstName'].value;
var lastName value=myForm.elements['lastName'].value;
//调用“Account”Java对象的“save”方法。
Account.Save(firstNameValue、lastNameValue);
}
名字:

姓氏:
"); BrowserView BrowserView=新的WinFormsBrowserView(浏览器); this.Controls.Add((Control)browserView.GetComponent()); } 公共类帐户 { 私人形式; 公共帐户(表格) { 这个。形式=形式; } public void Save(String firstName、String lastName) { 字符串_firstname=firstname; Form.Invoke(新操作(()=> { Form.Hide(); })); SecondForm frm=新的SecondForm(名字); frm.ShowDialog(); } } }