从打开的表单C#传递变量

时间:2013-06-19 04:56:37

标签: c# winforms

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

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

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

但我想知道如何为已经打开的Form1做这件事。

从几个表单(Form2,Form3,Form4等......)中获取几个案例,例如是否有多个从Form1调用的变量。可以通过表单从Form1调用任何变量。此外,表单可以调用其他表单中的变量(如果Form1和Form2打开,那么Form3可以调用Form1和Form2中的变量)

我知道这是一个巨大的清单,但如果有人能找到一个好方法来实现它,我真的很感激。

7 个答案:

答案 0 :(得分: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;
    }
}

你需要确保程序类中的luanched形式是

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());
    }
}

答案 1 :(得分:1)

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

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

编辑:

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

答案 2 :(得分: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;}

     }

答案 3 :(得分:0)

我认为你有理由不尝试System.Properties.Settings.Default 可从项目菜单访问 - &gt;视觉工作室的属性......

...谢谢

答案 4 :(得分: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.
}

}

答案 5 :(得分:0)

你可以通过以下方式实现,

在我的情况下,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上使用该实例来引用{ {1}}属性。

  3. 请告诉我,如果它无法解决您的问题。

    我希望它会对你有所帮助。 :)

答案 6 :(得分:0)

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

我的猜测是,

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

因此,您可以在项目的任何位置访问变量。