我有两种形式,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中的变量)
我知道这是一个巨大的清单,但如果有人能找到一个好方法来实现它,我真的很感激。
答案 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。请考虑,:))
//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;
}
此外,您可以拥有一个类文件,其中form1
的实例将为static
,以便您可以在form2
上使用该实例来引用{ {1}}属性。
请告诉我,如果它无法解决您的问题。
我希望它会对你有所帮助。 :)
答案 6 :(得分:0)
让我们看一下情况。您的应用程序中有多个表单,并且您希望访问这些表单中的多个变量。
我的猜测是,
public static class GlobalVariables
{
public static object MyVariable1 { get; set; }
public static object MyVariable2 { get; set; }
}
因此,您可以在项目的任何位置访问变量。