0

我有两种形式,Form1 和 Form2。Form1 有一个变量 int x。程序执行时,Form1 隐藏,Form2 显示;但是我需要从现有的 Form1 中调用该变量。

我知道通过调用 Form1 的新实例来调用变量的方法。

     Form1 r = new Form1();
     r.x = 20;

但我想知道如何为已经打开的 Form1 执行此操作。

采取几种情况,例如如果有多个从 Form1 调用的变量,则由多个表单(Form2、Form3、Form4 等......)。表单可以从 Form1 调用任何变量。此外,表单可以从其他表单调用变量(例如,如果 Form1 和 Form2 是打开的,那么 Form3 可以从 Form1 AND Form2 调用变量)

我知道这是一个庞大的列表,但如果有人能找到实现它的好方法,我将不胜感激。

4

7 回答 7

2

您必须引用“已打开”的 form1 实例,以便您可以引用该表单上的 x 值。

因此,假设 Form2 实例化了隐藏的 form1。您必须在 form2 中有对 form1 的引用,才能引用该变量。

好的,可以说这是form2的代码

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

    private void Form2_Load(object sender, EventArgs e)
    {
        f = new Form1
                {
                    Visible = false
                };
        int x = f.X;
    }
}

然后为form1编码

public partial class Form1 : Form
{
    public int X { get; set; }

    public Form1()
    {
        InitializeComponent();
        X = 20;
    }
}

并且您需要确保从程序类中获取的表单是

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form2());
    }
}
于 2013-06-19T04:59:33.193 回答
1

您可以通过以下方式进行操作,

在我的例子中,form1 是 form4,而 form2 是 form5。请考虑, :)

  1.  //code on form4:
    
    // this is by passing the reference of the form to other form
    public partial class Form4 : Form
    
    {
    
    public int a { get; set; }
    public int b { get; set; }
    
    public Form4()
    {
        InitializeComponent();
    }
    
    private void Form4_Load(object sender, EventArgs e)
    {
    
    }
    
    private void button1_Click(object sender, EventArgs e)
    {
        a = 5;
        b = 6;
    
        Form5 frm5 = new Form5();
    
        frm5.frm4 = this;
    
        this.Close();
    
        frm5.Show();
    }
     }
    
    // code on form5
    
    public Form4 frm4 { get; set; }
    
    private void Form5_Load(object sender, EventArgs e)
    {
        int x = frm4.a;
        int y = frm4.b;
    }
    
  2. 您还可以有一个类文件,其中的实例form1将是static,以便您可以使用该实例form2来引用form1's属性。

让我知道,如果它不能解决您的问题。

我希望它会帮助你。:)

于 2013-06-19T05:54:20.410 回答
1

在表单本身上创建一个公共属性。让 get 访问器返回表单值。你可以这样称呼它。Form1.MyProperty;

public string MyPrperty {
  get {
      return Form1.txtExample.text;
  }
}

编辑:

如果一次要返回这么多值,则可以返回所有这些值的字典。如果您要填写 20-40 个值,我会认真考虑重新考虑您的表格。对我来说,这听起来像是糟糕的用户体验。

于 2013-06-19T04:59:45.740 回答
0

让我们看看情况。您的应用程序中有多个表单,并且您希望访问这些表单的多个变量。

我的猜测是,

public static class GlobalVariables
{
    public static object MyVariable1 { get; set; }
    public static object MyVariable2 { get; set; }
}

因此,您可以在项目中的任何地方访问变量。

于 2013-06-19T14:40:50.810 回答
0

打开或关闭哪个表单都没有关系。您的最终目标是在 Form2 中访问来自 Form1 的成员,不是吗?如果在您创建 Form2 的实例时是这种情况,请这样做

    Form1 objForm1 = new Form1();
    Form2 obj = new Form2(objForm1);

所以在表格 2 类中看起来像这样

    class Form2: Form
    {
         private Form1 form1Object;
         public Form2(Form1 obj)
         {
              form1Object = obj;
         }

         private void SomeMethodInForm2()
         {
              //Here you can access the variable in form1 like
              form1Object.PropertyNameYouWantToAccess;
         }
     }

表格 1 类可以如下所示

     class Form1: Form
    {
         public int PropertyNameYouWantToAccess{get;}

     }
于 2013-06-19T05:06:04.867 回答
0

我认为你不会尝试System.Properties.Settings.Default 从项目菜单访问 - > Visual Studio 中的属性是有原因的...

谢谢...

于 2013-06-19T05:16:07.227 回答
0

我的猜测是您正在寻找System.Windows.Forms.Application.OpenForms属性,它将所有打开的表单保存在一个数组中。

您需要做的是检查每个表单的类型以及是否等效于Form1访问变量的值。此外,要访问表单外的变量,您需要将其访问修饰符设置为其中Public之一或为其创建相应的属性。

编辑

这是一个示例代码:(未经测试)

public partial class Form1 : Form
{

public int X;

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    X = 100;

    Form2 frm = new Form2();
    frm.Show();

    this.Hide();
}  
}



public partial class Form2 : Form
{

int local_X = 0;

public Form2()
{
    InitializeComponent();
}

private void Form2_Load(object sender, EventArgs e)
{
   foreach(Form f in System.Windows.Forms.Application.OpenForms)
   {
      if(typeof(f) == typeof(Form1))
    {
       local_X = f.X;   // access value here and set in local variable
    }
   }
}

private void button1_Click(object sender, EventArgs e)
{
   MessageBox.Show("Value of X is : " + local_X); // Show alert for value of variable on button click
}

}

编辑

或者您可以使用构造函数重载来完成此任务:

public partial class Form1 : Form
{

public int X;

public Form1()
{
    InitializeComponent();
}

private void Form1_Load(object sender, EventArgs e)
{
    X = 100;

    Form2 frm = new Form2(x); // pass variable to form2, if multiple values pass int array
    frm.Show();

    this.Hide();
}  
}



public partial class Form2 : Form
{

int local_X = 0;

public Form2()
{
    InitializeComponent();
}

// Overloading of constructor
public Form2(int X) // if multiple values pass int array
{
    InitializeComponent();
    local_X = x;  // capture value from constructor in class variable.
}

private void Form2_Load(object sender, EventArgs e)
{
   // no need to iterate here for now due to overloading value get passed during initialization.
}

private void button1_Click(object sender, EventArgs e)
{
   MessageBox.Show("Value of X is : " + local_X);  // display value if alert box.
}

}
于 2013-06-19T05:32:09.700 回答