7

I have 2 .cs files each with a class in it. How do I call a method in a class from Form1.cs in another class inside of Form2.cs?

Looks something like this...

Form1.cs

public partial class Class1 : ClassContainer
{
    public void awesomeMethod()
        {
        }
}

Form2.cs

class Class2 : SomethingChanged
{
    public void decentMethod()
    {
    }
}

I would like to call awesomeMethod() inside of the decentMethod(). Thanks.

4

6 回答 6

9

你的意思是,像这样?

public void decentMethod()
{
    Class1 instance = new Class1();
    instance.awesomeMethod();
}

您需要一个要调用该方法的类的实例。


或者,如果您不需要/不想使用实例,请将其设为静态方法:

public partial class Class1 : ClassContainer
{
    public static void awesomeMethod()
    {
    }
}

...

public void decentMethod()
{
    Class1.awesomeMethod();
}
于 2012-08-02T13:40:54.793 回答
4

为了调用一个类的实例方法,你需要一个类的实例。因此,要调用 Class1 的 awesomeMethod,您必须创建 Class1 的一个实例:

Class1 c = new Class1();
c.awesomeMethod();

但是,从您的开头段落中,听起来这两个实际类是两种不同的形式。在这种情况下,一个表单创建另一个表单的新实例纯粹是为了获得可能是一个辅助方法的东西并没有真正意义 - 创建第二个表单可能会产生大量开销。您最好将辅助方法放入一个单独的、更轻量级的类中。

于 2012-08-02T13:45:46.767 回答
1

我猜这些不是真正的方法签名。

是否awesomeMethod需要对任何成员的任何引用decentMethod

如果没有,它会很简单:

new Class1().awesomeMethod();
于 2012-08-02T13:41:13.723 回答
0

这是您可以在 Visual Studio 中尝试的方法。写下你对没有定义的方法的使用。例如,在您的代码中的某处,键入:

cls_a instance_a;

然后你会在 cls_a 下看到一条波浪线。右键单击“cls_a”并从弹出菜单中选择生成。然后看看会发生什么。

我看到创建了 App_Code 目录,并且在该目录的文件 cls_a.cs 中生成了类 cls_a。Visual Studio 生成了定义。它编译。

然后,您可以键入没有来自 cls_a 的定义的方法的使用,如下所示:

instance_a.meth_x();

再次,右键单击波浪线并选择生成。让 Visual Studio 为您生成定义。

我认为 ASP .NET 要求您将其他类放在 App_Code 子目录中。如果您需要按照自己的方式调整 ASP.NET,我认为可以编辑 Web.config 文件,这样您就可以将代码文件放在任何您想要的地方。我还没有审查如何做到这一点,所以我把它留给你或其他人。

无论如何,在 App_Code 子目录中没有你的类和方法会导致你的类和函数在你的 web 表单代码中看不到,即使其他一切都是正确的。

于 2013-09-12T03:56:35.057 回答
0

好的,我是这方面的初学者,并且想知道同样的事情。我相信我明白你在问什么。我只是尝试了这个,经过几次尝试它点击了,并且更新到这个也许我可以用我的话来简化它。我不知道您使用的是哪个程序,但我使用了 Visual Studio 2016。我创建了两个表单(Form1 和 Form2),每个表单都包含一个按钮。Form1 按钮和 Form2 按钮。当我单击 Form1 按钮时,它从 form2 调用一个方法,当我单击 Form2 按钮时,它从 Form1 调用一个方法。我注意到在解决方案资源管理器中它显示了两种形式以及它们包含的所有内容。如果我错了,我已经做了很多研究并纠正我,但我相信从父容器到子容器的顺序是这样的(命名空间>类>方法)。

这些是我的脚本。

表格1:

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

    }

    private void Form1_Load(object sender, EventArgs e)
    {
        Form2 frm2 = new Form2();
        frm2.Show();
    }

    private void f1button_Click(object sender, EventArgs e)
    {
        f2Words f2w = new f2Words();
        f2w.Words2();

    }
}
public class f1Words
{
    public void Words1()
    {
        MessageBox.Show("Form 1 Method Calling Worked!");
    }
}

表格2:

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

    private void Form2_Load(object sender, EventArgs e)
    {

    }

    private void f2button_Click(object sender, EventArgs e)
    {
        f1Words f1w = new f1Words();
        f1w.Words1();

    }
}
public class f2Words
{
    public void Words2()
    {
        MessageBox.Show("Form 2 Method Calling Worked!");
    }
}

在解决方案资源管理器窗口中,它显示了 Form1 和 Form2 的类。所以我决定尝试调用这些类的新实例。

“f1Words f1w = new f1words()”和“f2Words f2w = new f2Words()”。

然后就在这之后,我调用了这些类的新实例来使用它们包含的方法。

“f1w.Words1()”和“f2w.Words2()”

最终的结果是成功的。当我单击 Form1 的 Button1 时,它调用了 Form2 的 F2Words 类并从中拉出 Words2 方法,打开一个消息框,显示“Form2 方法调用成功!”,Form2 Button2 反之亦然。

由于这篇文章已有 4 年的历史,我假设您已经自己发现了这一点,并且可能找到了更好的解决方案,但是对于将来问同样问题的其他人,我希望这对您有所帮助。

于 2017-03-23T04:14:21.457 回答
0

假设主窗体是frmMain。在 frmMain() 的构造函数之外进行静态声明;在同一个构造函数中分配它:

public static frmMain p_frmMain = null;
public frmMain()
{
    InitializeComponent();
    :
    p_frmMain = this;
}

从另一个类(在同一解决方案中使用 main 的命名空间),调用 main 的 'btnHelloWorld_Click()' 方法:

AnotherClass_EventHandler(object sender, EventArgs e)
{
:  // Call frmmain()'s 'btnHelloWorld_Click' event:
   frmMain.p_frmMain.btnHelloWorld_Click (sender, e);
:
}
// Quick, dirty and done.
于 2017-09-20T19:21:43.050 回答