如何通过Form2的命令使Form1调用方法

时间:2014-09-13 11:53:20

标签: c# winforms nullpointerexception

我每次都被困在这里,显然我永远找不到按规则书运行的方法。 :( 我在Form1中有一个方法,我想从Form2调用它。或者:Form2命令Form1。 我从Form2调用它,但后来我得到一个NullPointerExp:

窗体2:

    private Form1 f1;

    public Form2(Form1 of)
    {
        InitializeComponent();
        this.f1 = of;
    }

    private void buttonOK_Click(object sender, EventArgs e)
    {
        f1.callMethod(3,3,1);
        Form.ActiveForm.Close();
    }

此方法在放置在Form1中的面板中创建一个按钮数组(猜测存在问题)。

我试图将callMethod()的参数传递给Form1到类变量。无论如何,我确信这是糟糕的风格。毕竟还是必须调用这个方法。

我有一个想法在Form1中创建一些监听器: 禁用Form1,直到在Form2中按下OK,然后callMethod +传递Form2传递的参数,或取消。

只是不知道哪种方式最好。我应该传递参数并在Form1中听吗?或者真的尝试让callMethod在Form1中工作,如果在Form2中调用的话? 有人有个主意吗?

提前致谢!

2 个答案:

答案 0 :(得分:2)

您需要将form1的当前实例传递给构造函数,就像在我的第一条注释中一样。否则它为null并且是您的null异常来自的地方。你应该得到编译错误,因为你的form2的构造函数需要一个参数,除非你有一个默认的参数没有你没有在这里显示的参数。

在Form1中更改您的方法来执行此操作:

Form2 userF = new Form2(this); // pass this to the constructor
userF.Show();

this 引用对象的当前实例,在本例中是调用Form2的Form1对象的当前实例。这将调用Form2的构造函数,该构造函数接受参数,并且您的null引用异常将消失。 关键字相当于VB.NET中的 Me 关键字,如果您熟悉它。

答案 1 :(得分:0)

您可以将方法设为静态,并通过调用:

来调用它
Form1.DoSomething();

根据您的需要,它是:

public Form2()
{
    InitializeComponent();
}

private static void buttonOK_Click(object sender, EventArgs e)
{
    Form1.DoSomething(parameters);
    Form.ActiveForm.Close();
}

Form1中的函数将是这样的:

public static void xxx(string x)
{
    Console.WriteLine(x);
}

区别在于静态属性。