【问题标题】:Open second windows form after click html button in DotNetBrowser单击 DotNetBrowser 中的 html 按钮后打开第二个窗体
【发布时间】:2026-02-14 16:10:01
【问题描述】:

我尝试使用带有特定 html 内容的 DotNetBrowser 控件打开一个窗口窗体,如下代码所示。

点击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();

    }

问题是,第一个表单(持有浏览器控件)没有隐藏并且仍然聚焦。

任何帮助将不胜感激。

【问题讨论】:

    标签: javascript c# dotnetbrowser


    【解决方案1】:

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

    要从 JavaScript 隐藏 .NET 回调中的表单,您需要将对其 Hide 方法的调用包装到 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(); 
            }
        }
    }
    

    【讨论】: