我每次都被困在这里,显然我永远找不到按规则书运行的方法。 :( 我在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中调用的话? 有人有个主意吗?
提前致谢!
答案 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);
}
区别在于静态属性。