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 操作 Form
和 Controls
或从 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
类并将button1
和button2
和textBox1
和webBrowser1
放在Form
上,将Modifer
的Modifer
设置为公开:
[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 窗体之间的交互的主要内容,如果未能解决你的问题,请参考以下文章