C# 使用主窗体传递带构造函数的数据
我有三种形式,f1,f2,f3我们称之为。我有一个类C# 使用主窗体传递带构造函数的数据,c#,winforms,oop,C#,Winforms,Oop,我有三种形式,f1,f2,f3我们称之为。我有一个类帐户,我在其中存储用户名,密码,组和路径(文件)F2是主要形式,应该与其他两种形式交互F1是登录表单,F3是编辑表单。我在program.cs中使用它在其他表单之前调用登录表单 Form1 login = new Form1(); if (login.ShowDialog() == DialogResult.OK) { Application.Run(new Form2()); } 为了在f2和f3之间传递数据,我使用account类
帐户
,我在其中存储用户名
,密码
,组
和路径
(文件)F2
是主要形式,应该与其他两种形式交互F1
是登录表单,F3
是编辑表单。我在program.cs中使用它在其他表单之前调用登录表单
Form1 login = new Form1();
if (login.ShowDialog() == DialogResult.OK)
{
Application.Run(new Form2());
}
为了在f2
和f3
之间传递数据,我使用account类的构造函数。但是,我也希望将数据从f1
传递到f2
,但是如果使用相同的方法,则表单之间不会发生数据交互(数据为空)
我将上述代码编辑为:
Form1 login = new Form1();
Account acc = new Account();
if (login.ShowDialog() == DialogResult.OK)
{
Application.Run(new Form2(acc));
}
在登录表单(f1
)中,我将一些数据传递给帐户
类,因此在登录按钮后,单击以下操作:
private void LoginButton_Click(object sender, EventArgs e)
{
Account acc = new Account();
//some code
acc.Groups = "New group";
//some more code
DialogResult = DialogResult.OK;
}
然后,在Form2.cs中,我有以下代码:
string groups = "";
public Form2(Account acc)
{
InitializeComponent();
groups = acc.Groups;
}
但是每当我这样运行它时,我从来没有在主窗体(
f2
)中得到任何结果,acc.Groups总是空的,我不知道确切的原因。我对构造函数使用了相同的方法将数据从f2
拉到f3
,效果很好,为什么不起作用?是因为我对登录表单使用了错误的方法吗?处理此问题的正确方法是什么?问题是您在LoginButton\u Click
事件中创建了Account
的新实例。你永远不会把这个实例传递给form2
在账户类型的Form1
类中创建一个字段:
Account my_account;
并重载构造函数以将帐户作为参数:
public Form1(Account acc)
{
my_account = acc;
}
然后在单击事件中引用字段my\u account
private void LoginButton_Click(object sender, EventArgs e)
{
//reference the class variable
my_account.Groups = "New group";
//some more code
DialogResult = DialogResult.OK;
}
在开始时,您需要将Account
的起始实例传递到Form1
构造函数中,以便用值填充它:
Account acc = new Account();
Form1 login = new Form1(acc);
if (login.ShowDialog() == DialogResult.OK)
{
Application.Run(new Form2(acc));
}
详细说明:
创建Account acc=new Account()的实例时代码>您将获得一个在内存中具有特定位置的唯一对象。当您将此对象传递给Form1
的构造函数并将其分配给私有字段my_account
时,实际上只传递acc
的引用。这意味着您要在内存中传递它的位置。这意味着当你这样做时:my_account=acc
在构造函数中,确保my_account
指向与acc
对象相同的位置。当您通过将字符串分配给组
来操作my_account
的值时,实际上是在操作原始acc
对象。从Form1
返回后,再次将acc
对象作为引用传递给下一个构造函数。因此,当您在Form2中访问groups=acc.groups中的该对象时代码>访问内存中已操作且已分配字符串的原始位置“新组”
在您发布的代码中,您使用Account acc=new Account()在Form1
中创建了一个完整的新对象
也是唯一的,并且与您在一开始创建的对象无关。此对象也与第一个acc
对象位于内存的不同部分。这就是当您试图在Form2
我希望这是可以理解的我看到您在两个地方创建了新的Account()(因此您有多个实例),但您没有将Account传递给form2
您可以像Janes在评论中建议的那样将帐户设置为静态,也可以使用属性来获取帐户。在表单1中,声明
public Account Account { get; set; }
public Form1 Form1{ get; set; }
在帐户中,声明
public Account Account { get; set; }
public Form1 Form1{ get; set; }
创建2个对象登录和acc后:
Form1 login = new Form1();
Account acc = new Account();
相互分配
login.Account = acc;
acc.Form1 = login;
如果您的帐户
类不依赖于任何类的具体信息,则您可以将帐户
类属性设置为静态,并从任何您想要的位置访问它们(Account.Groups=“New group”
)单击处理程序中引用的帐户和登录表单中声明的帐户是两个不同的对象。我希望避免声明任何静态或公共的内容。@BarryO'Kane我是一个新手,现在知道如何正确连接所有内容。请看这篇文章:这非常有效,谢谢,但是你能提供一点关于这是如何工作的细节吗?@EInherjar我编辑了我的文章并写了详细的解释。看一看。希望这是可以理解的。如果不是的话,请给我留言