2012-11-01 51 views
1

我想从其他类的类“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方法。

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

+1

将其标记为'公共'而不是'私人'。 –

回答

2

您的WebBrowser组件不是静态的(这是一件好事),因此当您的代码示例尝试执行时,您无法直接从Form1引用它们。您必须获取对Form1实例的引用,然后您可以调用它们上的方法,只要它们被标记为公共。根据您的需求很可能是更好的只是沿着引用传递直接到你的web浏览器的组件

也许是这样的:

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); 
    } 
} 
0

在Form1:

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

但你将无法访问,这个类定义,除非场它们也是静态的。

相关问题