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

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

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

从Html操纵WinForms

要从WebBrowser控件操作Form并调用C#方法并访问表单属性,您应该使用[ComVisibleAttribute(true)]装饰表单,然后可以将表单设置为WebBrowser控件的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控件的值:

通过使用desginer将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类,并将button1button2以及textBox1webBrowser1放在FormtextBox1Modifer设置为public:

 [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 = @"  Test     

"; 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#"); } }