如何在Form2中使用Form1中的变量?

时间:2011-11-30 18:53:50

标签: c# .net winforms

我有两种形式:Form1和Form2。我使用:

打开Form2
Form2 newForm2 = new Form2(this);

现在我想从Form1中访问一些公开设置的变量或方法,如:public int counter;

但是当我从Form2尝试这个时,它给了我一个错误:

Error 4 'System.Windows.Forms.Form' does not contain a definition for 'StartGame' and no extension method 'StartGame' accepting a first argument of type 'System.Windows.Forms.Form' could be found (are you missing a using directive or an assembly reference?)

编辑: 在表格1中:

Form2 newForm2 = new Form2(answer, button3, button4, button5, button6, this, fiftyfifty, web, change);
newForm2.Show();

表格2:

Form originalParent;
public Form2(int answer, Button button3, Button button4, Button button5, Button button6, Form parentform, int fiftyfifty, int web, int change)
{
    InitializeComponent();
    originalParent = parentform;
}

我试图像originalParent."public Method here"那样访问它,它给了我这个错误。

8 个答案:

答案 0 :(得分:3)

您的Form2构造函数被定义为在构造函数中获取通用Form作为参数。 您需要获取Form1类型的表单,因此请将Form2构造函数更改为:

   private Form1 originalParent;
   public Form2(
          int answer, Button button3, Button button4,
          Button button5, Button button6,
          Form1 parentform, int fiftyfifty,
          int web, int change)
   { 
       InitializeComponent();
       originalParent = parentform;
   }

答案 1 :(得分:2)

根据您发布的代码,我假设您已为Form2编写了一个构造函数,该构造函数采用Form的实例。编辑此构造函数,以便它取代Form1的实例。或者只是将Form实例强制转换为Form1

答案 2 :(得分:0)

将ref转换为Form2中Form1的类型,然后访问Form1的公共函数。

答案 3 :(得分:0)

您需要在Form1的实例上调用StartGame,而不是System.Windows.Forms.Form。

如果Form1是Form2的所有者,那么您需要将所有者转换为Form1类型。如果Form1是Form2的Ctor的参数,那么您需要确保将Ctor参数定义为Form1类型并从Form2实例保留对Form1的引用。

答案 4 :(得分:0)

我假设您的Form2构造函数的this参数是Form1实例,因此从Form1调用此代码。

我还假设你有一个Form2 private Form _form1;的私有成员,其值在构造函数中赋值。

如果这些假设是正确的,您可以通过将声明更改为private Form1 _form1;来解决此问题。

您还需要将构造函数参数的类型从Form更改为Form1(更改为MusiGenesis)。

答案 5 :(得分:0)

您可以检查表单2是否获得定义变量的表单1的实例。一旦你获得了form1实例的实例ID,你就可以调用表单2,只需创建一个新表单1 ref。

即。 Form1 frm1; public find(Form1 callingform) { InitializeComponent(); frm1 = callingform; }

然后只需调用表格2 form2(this);

答案 6 :(得分:0)

取决于您为什么需要这样做,您还可以将所需的变量或方法定义为静态。在Form1上:

public static int counter;

在Form2上,您可以访问它而无需将父窗体实例作为参数传递给Form2构造函数,如下所示:

Form1.counter++;

答案 7 :(得分:0)

1-如果您需要{{1},请在控件的属性窗格上选择这些控件并将其修饰符设置为public。与他们互动。

2-这部分不是你问题的答案,但它可能会帮助你理解为什么你不应该像你一样做事。

我用几乎相同的代码制作了一个应用程序,但有人告诉我这不是一个好习惯,甚至不像OOP,所以I posted a question尝试学习更多。

看一下,这些代码可以帮助您设置不同的内容,甚至可以按照您尝试的方式进行设置。