修改类中的值,然后以其他形式使用它

时间:2016-08-29 01:26:12

标签: c# winforms

我有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;       
    }
}}

窗体2

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;                  
    }          
}}

2 个答案:

答案 0 :(得分:1)

您的代码中有许多内容可以改进。但主要问题是,当您在Login方法中创建loginToolStripMenuItem_Click()类时,新的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;
    }

    // ...
}

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

答案 1 :(得分:-1)

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