C# 使用主窗体传递带构造函数的数据

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类

我有三种形式,f1,f2,f3我们称之为。我有一个类
帐户
,我在其中存储
用户名
密码
路径
(文件)
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我编辑了我的文章并写了详细的解释。看一看。希望这是可以理解的。如果不是的话,请给我留言