WebBrowser 控件和 Windows 窗体之间的交互

Posted

技术标签:

【中文标题】WebBrowser 控件和 Windows 窗体之间的交互【英文标题】:Interaction between WebBrowser Control and Windows Forms 【发布时间】:2016-04-22 10:42:35 【问题描述】:

我正在管理各种联系信息 - 电话、地址、电子邮件、IM 等,我希望它看起来不错并节省空间,所以我想在 WebBrowser 控件中显示它。我可以将标记和内容动态创建到流中,并以任何格式显示,颜色和字体大小易于调整。我还可以将按钮<input> 用于添加、编辑和删除。我喜欢这种方法,因为它看起来比 RichTextBox 更简单、更好看(如果您不这么认为,请纠正我。) 问题是关于响应这些按钮。如果选择了一个,我想隐藏 WebBrowser 并取消隐藏面板,其中包含允许输入新联系人或编辑现有联系人所需的 TextBox 控件。我听说这可以做到。我希望得到建议。我能想到的只是一些代码来接收 AJAX 调用,这会引发 Windows 事件,但这似乎......很奇怪。 任何想法、链接或建议都将不胜感激.. 甚至是不这样做的好理由,但这对于高质量的信息呈现来说似乎是一个好主意,而且我已经动态生成了大量的 html

【问题讨论】:

您可以从 Web 浏览器控件操作外部控件,也可以使用外部控件操作 Web 浏览器控件。我相信有时使用WebBrowser 控件而不是RichTextBox 会更好,但我在这里看不到选择网络浏览器控件的证据。看来,要满足您的数据输入要求,有一个DataGridView 和一些对话框来添加、编辑和删除联系信息就足够了,您不需要创建这样的应用程序类型。 【参考方案1】:

您可以使用 javascript 操作 FormControls 或从 WebBrowser 调用 C# 方法,还可以操作 WebBrowser 控件的内容或从 C# 调用 JavaScript 方法。

从 Html 操作 WinForms

要从WebBrowser 控件操作您的Form 并调用C# 方法并访问您的表单属性,您应该使用[ComVisibleAttribute(true)] 装饰您的表单,然后您可以将表单设置为ObjectForScripting 控件的ObjectForScripting 属性。

[ComVisibleAttribute(true)]
public partial class Form1 : Form

    private void Form1_Load(object sender, EventArgs e)
    
        this.webBrowser1.ObjectForScripting = this;
    

然后您可以通过这种方式简单地调用方法并访问窗口中的元素:

从 JavaScript 调用 C# 方法:

window.external.SomeCSMethod('Method called from JavaScript');

通过 JavaScript 设置 WinForms 控件的值:

通过使用设计器将Modifier 属性的值设置为public,使Form 上的textBox1 控件公开。然后可以从 JavaScript 访问它:

window.external.textBox1.Text='Value set from JavaScript';

从 WinForms 操作 Html

您可以从 C# 代码操作 Web 浏览器控件的 html 内容,并使用 WebBrowser 控件的 Document 属性的方法调用 JavaScript 方法或设置 html 元素的值:

从 C# 调用 JavaScript 方法:

this.webBrowser1.Document.InvokeScript("someJSMethod", new []"Method called from C#");

从 C# 中设置 Html 控件的值:

this.webBrowser1.Document.GetElementById("text1")
                         .SetAttribute("Value set from C#", "Value From C#");

示例代码:

您可以创建一个Form1 类并将button1button2textBox1webBrowser1 放在Form 上,将ModiferModifer 设置为公开:

[ComVisibleAttribute(true)]
public partial class Form1 : Form

    public Form1()
    
        InitializeComponent();
        this.Load += Form1_Load;
        button1.Click += button1_Click;
        button2.Click += button2_Click;
    

    private void Form1_Load(object sender, EventArgs e)
    
        this.webBrowser1.DocumentText =
        @"<html>
        <head>
        <title>Test</title>
        <script>
            function someJSMethod(value)alert(value);
        </script>
        </head>
        <body>
            <input type=""text"" id=""text1""/>
            <br/>
            <input type=""button"" value=""Call C# Method"" id=""button1""
            onclick=""window.external.SomeCSMethod('Method called from JavaScript');""/>
            <br/>
            <input type=""button"" value=""Set WinForms Control Value"" id=""button2""
            onclick=""window.external.textBox1.Text='Value set from JavaScript';""/>
        </body>
        </html>";
        this.webBrowser1.ObjectForScripting = this;
    

    public void SomeCSMethod(string value)
    
        MessageBox.Show(value);
    

    private void button1_Click(object sender, EventArgs e)
    
        this.webBrowser1.Document
                        .InvokeScript("someJSMethod", new[] "Method called from C#" );
    

    private void button2_Click(object sender, EventArgs e)
    
        this.webBrowser1.Document.GetElementById("text1")
                                 .SetAttribute("value", "Value set from C#");
    

【讨论】:

Reza,这是一个很棒的解释和例子。我在这方面找不到任何东西。代码是完整的并且可以完美运行......尽管必须记住文本框上的修饰符。我将使用此代码。请原谅我没有给你的答案打分,但是在 Stack Exchange 上问了这样的高级代码功能 10 或 15 年后,我仍然没有积累足够的声誉点来做到这一点。

以上是关于WebBrowser 控件和 Windows 窗体之间的交互的主要内容,如果未能解决你的问题,请参考以下文章

WebBrowser 控件和 JavaScript 错误

vb 释放Webbrowser控件

在 WebBrowser 控件中检测滚动到底部

带有 IDownloadManager 的 Windows 窗体 Webbrowswer 控件

c# WebBrowser 控件滚动条

C# WebBrowser控件使用整理