2

我正在尝试从另一个类中调用类“Form1”中的方法。这是我的代码

namespace WindowsFormsApplication1
{

    public partial  class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            MessageBox.Show("loaded");
            orders.ObjectForScripting = new ScriptInterface();
        }

        private void webBrowser2_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { }
        private void button1_Click_1(object sender, EventArgs e) { }

    }

    [System.Runtime.InteropServices.ComVisibleAttribute(true)]
    public class ScriptInterface
    {
        public void callMe(string currid)
        {
            MessageBox.Show(currid);
            // the following throws security error
            Form1.webBrowser2.Navigate("http://www.mywebpage.com/client/index.php?id="+currid);
        }
    }

}

信息:我有 2 个网络浏览器。我正在从 webBrowser1 捕获事件以更新 webBrowser2。我的问题是,我不能在 Form1 之外调用 webbrowser2 方法。

有什么想法可以解决这个问题吗?

4

2 回答 2

2

您的 WebBrowser 组件不是静态的(这是一件好事),因此您不能直接从 Form1 引用它们,因为您的代码示例正在尝试这样做。您必须获得对 Form1 实例的引用,然后您可以在它们上调用方法,只要它们被标记为 public。根据您的需要,将引用直接传递给您的 WebBrowser 组件可能会更好

也许是这样的:

orders.ObjectForScripting = new ScriptInterface(this.webBrowser2);

...

public class ScriptInterface
{
    private WebBrowser _browser;

    public ScriptInterface(WebBrowser browser)
    {
        _browser = browser;
    }
    public void callMe(string currid)
    {
        _browser.Navigate("http://www.mywebpage.com/client/index.php?id="+currid);
    }
}
于 2012-11-01T21:48:44.353 回答
0

表格 1:

Form1.webBrowser2.Navigate(...)

不是一个对象,但它是你的类型。你需要创建你的类的一个实例,或者如果你愿意,创建一个能够调用它的方法的对象:

Form1 form = new Form1();
form.webBrowser2.Navigate(...)

最重要的是,您的方法已标记private,这意味着它们只能从您的实例内部调用。public如果您希望其他对象能够调用它们,则应该标记它们。

public void webBrowser2_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { ... }

或者,如果您不想创建实例,则可以将此方法声明为static

public static void webBrowser2_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { ... }

但是您将无法访问此类定义的字段,除非它们也是静态的。

于 2012-11-01T21:41:23.590 回答