C# 修改类中的值,然后以另一种形式使用它

C# 修改类中的值,然后以另一种形式使用它,c#,winforms,C#,Winforms,我有一、二年级和一个班。我想使用form2修改类中的变量,然后在form1中读取该变量 问题是,当我试图从form1读取变量时,它不会改变,也不会在我再次打开form2后保持不变 这是我的代码: 表格1 表格2 第一类 namespace app1.Modules { class Class1 { public string user; public void changeusr(string u) { user = u; return;

我有一、二年级和一个班。我想使用form2修改类中的变量,然后在form1中读取该变量

问题是,当我试图从form1读取变量时,它不会改变,也不会在我再次打开form2后保持不变

这是我的代码:

表格1

表格2

第一类

namespace app1.Modules {
class Class1 {
    public string user;
    public void changeusr(string u) {
        user = u;
        return;                  
    }          
}}

您的代码中有许多地方可以改进。但主要问题是,当您在
loginToolStripMenuItem\u Click()
方法中创建
Login
类时,新的
Login
实例也在创建
Class1
的新实例,并使用该实例而不是
Form1
知道的实例。因此,当
Login
更改用户值时,它会在
Form1
不知道的位置进行更改

最简单的修复方法是让
Form1
只需将
Class1
引用传递给
Login
供其使用,而不是让
Login
创建自己的实例。例如:

public partial class Login : Form {
    // ...

    readonly Class1 md;
    public Login(Class1 md) {
        InitializeComponent();
        this.md = md;
    }

    // ...
}
表格1
中:

private void loginToolStripMenuItem_Click(object sender, EventArgs e) {
    Login login = new Login(md);
    login.MdiParent = this;
    login.enbctrs += new ShowFrm(enablecrts);
    login.disctrs += new ShowFrm(disablecrts);
    login.Show();
}

然后,当
Login
更改用户并引发事件时,它将更改
Form1
正在使用的同一实例中的值,因此
Form1
将在其自己的代码中获得所需的值。

我不确定您试图实现什么。每次加载页面时,您都在“更新”Class1实例。您需要某种持久性机制。您应该使用静态类和成员来保留其值。否则,您将以XML格式保存当前状态,并在每次加载时加载它。以下页面可能会对您有所帮助:。代码转储没有帮助。请解释您的代码如何应用于该问题?暂时忽略全局变量是对象之间最糟糕的通信方式,您提出的全局变量如何解决OP描述的问题?
public static class global{
    public static int myInt = 0;
}
public class Form1{
     global.myInt = 10;
}
public class Form2{
      Console.WriteLine(global.myInt.ToString());
}
public partial class Login : Form {
    // ...

    readonly Class1 md;
    public Login(Class1 md) {
        InitializeComponent();
        this.md = md;
    }

    // ...
}
private void loginToolStripMenuItem_Click(object sender, EventArgs e) {
    Login login = new Login(md);
    login.MdiParent = this;
    login.enbctrs += new ShowFrm(enablecrts);
    login.disctrs += new ShowFrm(disablecrts);
    login.Show();
}