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

本文关键字:另一种 然后 修改 | 更新日期: 2023-09-27 18:04:22

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

事情是,变量不改变,当我试图从form1中读取它,也不停留后,我打开form2再次。

这是我的代码:

Form1

namespace app1 {
public partial class Form1 : Form {
    Class1 md = new Class1();
    public Form1() {
        InitializeComponent();
    }
    private void loginToolStripMenuItem_Click(object sender, EventArgs e) {
        Login login = new Login();
        login.MdiParent = this;
        login.enbctrs += new ShowFrm(enablecrts);
        login.disctrs += new ShowFrm(disablecrts);
        login.Show();
    }
    private void Form1_Load(object sender, EventArgs e) {            
        if (md.user == null) {
            disablecrts();
            stat_usr.Text = "No active user";
        } else {
            stat_usr.Text = md.user.ToString();
        }
    }
    void disablecrts() {
        stat_usr.Text = "No active user";
    }
    void enablecrts() {
        stat_usr.Text = md.user;       
    }
}}

Form2

namespace app1.Forms {
public delegate void ShowFrm();
public partial class Login : Form {
    public event ShowFrm enbctrs;
    public event ShowFrm disctrs;
    int ing_counter = 0;
    Class1 md = new Class1();
    public Login() {
        InitializeComponent();
    }
    private void button1_Click(object sender, EventArgs e) {
        string u = "user";
        string p = "pass";
        if(Txt_user.Text == u && Txt_pass.Text == p) {
            string msg = "Welcome: " + u + "";
            MessageBox.Show(msg, "", MessageBoxButtons.OK);
            md.changeusr(u);                
            active_user.Text = md.user.ToString();
            enbctrs();
        }
    private void Login_Load(object sender, EventArgs e) {
        if (md.user == null) {
            active_user.Text = "No active user";
        } else {
            active_user.Text = md.user.ToString();
        }
    }
}}

Class1

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

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

您的代码中有许多可以改进的地方。但主要问题是,当您在loginToolStripMenuItem_Click()方法中创建Login类时,新的Login实例也创建了Class1的新实例,并使用该实例而不是Form1所知道的实例。所以当Login改变user值时,它是在一个Form1不知道的位置改变的。

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

public partial class Login : Form {
    // ...
    readonly Class1 md;
    public Login(Class1 md) {
        InitializeComponent();
        this.md = md;
    }
    // ...
}

Form1:

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将在自己的代码中获得所需的值。

public static class global{
    public static int myInt = 0;
}
public class Form1{
     global.myInt = 10;
}
public class Form2{
      Console.WriteLine(global.myInt.ToString());
}