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

C# 从打开的表单C传递变量#,c#,winforms,C#,Winforms,我有两张表格,表格一和表格二。Form1有一个变量int x。执行程序时,隐藏Form1,显示Form2;但是,我需要从现有Form1中调用该变量 我知道通过调用Form1的新实例来调用变量的方法 Form1 r = new Form1(); r.x = 20; 但我想知道如何为一个已经打开的窗体1执行此操作 举几个例子,比如如果有多个变量是由多个表单(Form2、Form3、Form4等)从Form1调用的。表单可以从Form1调用任何变量。此外,表单可以从其他表单调用变

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

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

     Form1 r = new Form1();
     r.x = 20;
但我想知道如何为一个已经打开的窗体1执行此操作

举几个例子,比如如果有多个变量是由多个表单(Form2、Form3、Form4等)从Form1调用的。表单可以从Form1调用任何变量。此外,表单可以从其他表单调用变量(例如,如果Form1和Form2是打开的,那么Form3可以从Form1和Form2调用变量)


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

您必须有一个对“已打开”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;
    }
}
您需要确保从program类获取的表单是

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());
    }
}
静态类程序
{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(新Form2());
}
}

您必须有一个对“已打开”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;
    }
}
您需要确保从program类获取的表单是

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());
    }
}
静态类程序
{
/// 
///应用程序的主要入口点。
/// 
[状态线程]
静态void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(新Form2());
}
}

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

public string MyPrperty {
  get {
      return Form1.txtExample.text;
  }
}
编辑:
如果一次要返回的值很多,那么可以返回所有这些值的字典。我会认真考虑重新思考你的形式,如果你有20-40的价值被填补。对我来说,这听起来像是一个糟糕的用户体验

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

public string MyPrperty {
  get {
      return Form1.txtExample.text;
  }
}
编辑:
如果一次要返回的值很多,那么可以返回所有这些值的字典。我会认真考虑重新思考你的形式,如果你有20-40的价值被填补。对我来说,这听起来像是一个糟糕的用户体验

打开或关闭哪个表单并不重要。您的最终目标是访问Form2中Form1的成员,不是吗?如果在创建Form2实例时出现这种情况,请按如下方式执行

    Form1 objForm1 = new Form1();
    Form2 obj = new Form2(objForm1);
    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;
         }
     }
     class Form1: Form
    {
         public int PropertyNameYouWantToAccess{get;}

     }
所以在中二课堂上看起来是这样的

    Form1 objForm1 = new Form1();
    Form2 obj = new Form2(objForm1);
    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;
         }
     }
     class Form1: Form
    {
         public int PropertyNameYouWantToAccess{get;}

     }
表单1类可以如下所示

    Form1 objForm1 = new Form1();
    Form2 obj = new Form2(objForm1);
    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;
         }
     }
     class Form1: Form
    {
         public int PropertyNameYouWantToAccess{get;}

     }

打开或关闭哪个表单并不重要。您的最终目标是访问Form2中Form1的成员,不是吗?如果在创建Form2实例时出现这种情况,请按如下方式执行

    Form1 objForm1 = new Form1();
    Form2 obj = new Form2(objForm1);
    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;
         }
     }
     class Form1: Form
    {
         public int PropertyNameYouWantToAccess{get;}

     }
所以在中二课堂上看起来是这样的

    Form1 objForm1 = new Form1();
    Form2 obj = new Form2(objForm1);
    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;
         }
     }
     class Form1: Form
    {
         public int PropertyNameYouWantToAccess{get;}

     }
表单1类可以如下所示

    Form1 objForm1 = new Form1();
    Form2 obj = new Form2(objForm1);
    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;
         }
     }
     class Form1: Form
    {
         public int PropertyNameYouWantToAccess{get;}

     }

我认为有一个原因是您不愿意尝试
System.Properties.Settings.Default
可从visual studio中的项目菜单-->属性访问


谢谢…

我想这是你不愿意尝试
System.Properties.Settings.Default
可从visual studio中的项目菜单-->属性访问


谢谢…

我猜您正在寻找一个数组中包含所有打开表单的属性

您需要做的是检查每个表单的类型,以及它是否等同于
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(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.
}

}

我的猜测是,您正在寻找包含数组中所有打开形式的属性

您需要做的是检查每个表单的类型,以及它是否等同于
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(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.
}

}

你可以用以下方法来做

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

  • 您还可以拥有一个类文件,其中
    form1
    的实例将是
    static
    ,这样您就可以在
    form2
    上使用该实例来引用
    form1的
    属性

  • 让我知道,如果它不能解决你的问题


    我希望它能帮助你。:)

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

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

  • 您还可以拥有一个类文件,其中
    form1
    的实例将是
    static
    ,这样您就可以在
    form2
    上使用该实例来引用
    form1的
    属性<