从其他类调用类方法不起作用

时间:2012-11-01 21:33:17

标签: c# visual-studio-2010 navigation browser

我正在尝试从其他类中调用类“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个WebBorwsers。我正在从webBrowser1捕获事件以更新webBrowser2。 我的问题是,我不能在Form1之外调用webbrowser2方法。

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分: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);
    }
}

答案 1 :(得分:0)

Form1 in:

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) { ... }

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