修改类中的值,然后以另一种形式使用它
本文关键字:另一种 然后 修改 | 更新日期: 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());
}