2016-07-21 53 views
-2

使用VS我创建了主窗体(在软件运行时第一次打开)及其类X,在这个类XI中有一个方法Y,我必须从另一个窗体访问它类,但不能使它成为静态的,如果我尝试XY()它显然说我需要引用该类的一个实例。有没有办法获得这个主表单的实例的引用,而不是再次实例化它,我相信当程序开始运行或者类似的时候,它被实例化了?C# - 从另一个类访问主窗体方法

+0

你创建的'的'级X' –

+0

内的另一种形式class'将委托第二种形式的一个实例,并传递对主窗体方法的引用。然后第二种形式可以调用它。 – DeanOC

+0

nope,im not @ un-lucky –

回答

0

FormX成为主要类有一个名为MethodY,你想从AnotherClass访问。对于您可以使用这样的:

定义为class FormX,主要形式

class FormX 
{ 
    public delegate void refreshDelegate(); 
    public event refreshDelegate refreshEvent; 
    AnotherClass AnotherClassInstance = new AnotherClass(); 
    public FormX() 
    { 
     refreshEvent += new refreshDelegate(MethodY); 
     AnotherClassInstance.AccessParentMethod = refreshEvent; 
    } 

    public void MethodY() 
    { 

     // do something 
    } 
} 

为儿童类AnotherClass

public class AnotherClass 
{ 
    public Delegate AccessParentMethod; 
    public void ClassMethod() 
    { 
    // Access form method 
     AccessParentMethod.DynamicInvoke(); 
    } 
} 

定义使用上面的代码,你洁具定义事件refreshEvent类型为refreshDelegate,并通过其实例分配给AnotherClass的名为AccessParentMethod的委托人。所以通过调用AccessParentMethod.DynamicInvoke()你实际上调用了主类的MethodY()。如果您想将子对象的一些参数传递给主类,请在委托定义中进行以下更改;

public delegate void refreshDelegate(object SomeValue); 
public event refreshDelegate refreshEvent; 
// Changes in MethodY 
public void MethodY(object SomeValue) 
{ 
    // do something 
} 

那么你可以使用下面的代码调用MethodY

AccessParentMethod.DynamicInvoke("This is the argument"); 
+0

欣赏Downvote;不要成为隐藏的敌人,试图透露原因。这可能会帮助我改善帖子 –

+0

你的帖子看起来不错。我猜你是因为回答低质量问题而被低估的。 – DeanOC

0

你可以做这样的事情。

Form f = Application.OpenForms["YourFormName"]; 

然后,您可以将f转换为您的表单类型并访问所有公共方法和属性。

+0

对不起,这是C#的方式,但你也可以做类似的VB。 – Bikswan

+0

不管怎样,OP都想'c#'所以一切都很好 – MickyD

+0

是的。问题说VS用来创建一个表单,一些我如何读取它作为VB。无论如何,谢谢。 :) – Bikswan

相关问题